如何验证URL参数是否未被篡改?

时间:2014-12-23 21:23:59

标签: java checksum

想象一下,我有一个用Java实现的网页,可以在http://mycompany.com/page1.xhtml?trafficSource=someTrafficSourceIdentifier&checkSum=...获得。

我想跟踪不同流量来源(例如不同的广告系列)产生的网页访问次数。为此,我有trafficSource参数。该组流量来源ID限制为5个可能的值(例如Google自然,Google AdWords,YouTube,Facebook,Twitter)。

想象一下,我想确保trafficSource没有被篡改(没有人放置不同的值)。为此,我引入了checkSum参数。

为字符串X(checkSum = f(X))创建校验和的最简单方法是什么,以便将不同的输入字符串转换为不同的校验和?

此措施的目的是检查我的参数基本

我尝试使用以下内容,但它会生成一个包含非字母数字字符的字节数组,我无法将其放入网址中。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class CheckSumGenerator {
    public String calculateCheckSum(final String aInput) throws NoSuchAlgorithmException {
        final MessageDigest md = MessageDigest.getInstance("SHA");

        final byte[] checkSumBytes = md.digest(aInput.getBytes());

        final String result = new String(checkSumBytes);

        return result;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以从http请求标头获取服务器端的引荐来源,这对用户是不可见的。这可以识别来自youtube或facebook的访客。

要解决将哈希值转换为字母数字字符串的问题,可以将结果字节转换为十六进制代码。

final String result = DatatypeConverter.printHexBinary(checkSumBytes);