>想象一下,我有一些用Java实现的网页,可以在http://mycompany.com/page1.xhtml?trafficSource=someTrafficSourceIdentifier&checkSum=...
上找到。
我想跟踪不同流量来源(例如不同的广告活动)产生的页面访问量。为此,我有 trafficSource
参数。流量来源 ID 集限制为 5 个可能的值(例如 Google 自然、Google AdWords、YouTube、Facebook、Twitter)。
想象一下,我想确保trafficSource
没有被篡改(没有人在那里放置不同的值)。为此,我引入了 checkSum
参数。
为字符串 X ( checkSum = f(X)
) 创建校验和的最简单方法是什么,以便将不同的输入字符串转换为不同的校验和?
此度量的目的是对我的参数进行基本检查。
我尝试使用以下方法,但它生成了一个包含非字母数字字符的字节数组,我无法将其放入 URL 中。
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;
}
}
您可以从 http 请求标头获取服务器端的引用,该标头对用户不可见。这可以识别来自YouTube或Facebook的访问者。
要解决将哈希转换为字母数字字符串的问题,您可以将生成的字节转换为十六进制代码。
final String result = DatatypeConverter.printHexBinary(checkSumBytes);