Java Hmac-Sha1与Nodejs不同
我一直在尝试一种基本的HMAC-SHA1请求签名方法 服务器使用NodeJS来验证签名。为了检查我应该得到什么,我编写了下面的脚本在本地运行(我已经用cURL进行了测试,以确保它生成了正确的签名) 它打印出Java Hmac-Sha1与Nodejs不同,java,node.js,python-3.x,hmacsha1,Java,Node.js,Python 3.x,Hmacsha1,我一直在尝试一种基本的HMAC-SHA1请求签名方法 服务器使用NodeJS来验证签名。为了检查我应该得到什么,我编写了下面的脚本在本地运行(我已经用cURL进行了测试,以确保它生成了正确的签名) 它打印出70c244c06513c882bb8704c2d887a95a08d77f3a 客户的签名代码为 String xSignature = null; final char[] hexArray = "0123456789abcdef".toCharArray(); try {
70c244c06513c882bb8704c2d887a95a08d77f3a
客户的签名代码为
String xSignature = null;
final char[] hexArray = "0123456789abcdef".toCharArray();
try {
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(key);
byte[] digest = mac.doFinal(body.getBytes("UTF-8"));
char[] hexChars = new char[digest.length * 2];
for (int j = 0; j < digest.length; ++j) {
int v = digest[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
xSignature = new String(hexChars);
} catch (Exception e) {
System.out.println(e.getMessage());
}
返回与Java方法相同的5f855052675f135da151d6fa844a7678ede90afc
但是,无论我在哪里看到,NodeJS代码似乎都是100%正确的。所以我猜我的Java和Python代码中有一个常见的缺陷
如有任何见解,将不胜感激
以下是我看过的其他一些网页
更新:使用更简单的字符串“asdfghjkl”而不是复杂的JSON字符串,生成相同的签名。因此,在将Java/Python与NodeJ进行比较时,似乎有一些看不见的字符正在改变摘要。我找到了问题的解决方案(忘了在这里发布答案)。当字典的键值对顺序不同时,签名也不同。这么简单的疏忽 所以, 将生成一个不同的摘要字符串,以便
{
"key2": "Value2",
"key1": "Value1"
}
因此,在计算两种语言之间的HMAC-SHA1时,请确保键值的顺序完全相同
import hashlib
import hmac
import json
from collections import OrderedDict
body = json.dumps(json.load(open("json-events/test-event.json"),
object_pairs_hook=OrderedDict), indent=2).encode("utf-8")
sig = hmac.new(secret_key, msg=body, digestmod=hashlib.sha1).hexdigest()
print(sig)
{
"key1": "Value1",
"key2": "Value2"
}
{
"key2": "Value2",
"key1": "Value1"
}