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



>想象一下,我有一些用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);

相关内容

最新更新