因此,我正在努力使用 Java 验证 Facebook 的 signed_request。不幸的是,我一直在验证过程中遇到问题。我查看了这个文档,并模拟了他们的算法,但没有成功。我也跟着这个教程,并继续想出我计算的签名与 Facebook 发送的签名不同。
或者至少,这就是 String.equals() 告诉我的。
所以我决定再戳一下。
我将其设置为迭代计算签名和提供的签名中的字节。瞧,我签名的前 32 个字节与他们的完全匹配。它只是丢失了另外 400 多个字节的数据。
那时,我决定我应该更好地了解到底发生了什么。我查找了 SHA-256,发现它确实只创建了 32 个字节的信息。所以我留下了超过 400 字节的数据,Facebook 声称这些数据是使用 HMAC SHA-256 算法生成的。我想我应该将 SHA-256 的最大长度与我正在散列的数据的长度进行比较,但这只是表明有很多空间可供使用(消息大小:575 字节;最大大小:2.305843009213694 x 10^18 字节)。
Facebook 是在造谣吗?还是我错过了什么?
编辑
这是我用来散列数据的函数。我传入我的 facebook 密码(用于密钥)和 base64url 编码的 JSON 对象(用于数据)。它始终返回一个长度为 32 的字节数组,其中的数据与 facebook 提供的签名的前 32 个字节相匹配。
private byte[] hmacSHA256(String data, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKey);
mac.update(data.getBytes("UTF-8"));
byte[] hmacData = mac.doFinal();
return hmacData;
}