Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hmac-Sha1与Nodejs不同_Java_Node.js_Python 3.x_Hmacsha1 - Fatal编程技术网

Java Hmac-Sha1与Nodejs不同

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 {

我一直在尝试一种基本的HMAC-SHA1请求签名方法

服务器使用NodeJS来验证签名。为了检查我应该得到什么,我编写了下面的脚本在本地运行(我已经用cURL进行了测试,以确保它生成了正确的签名)

它打印出
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"
}