当前位置: 首页 > 知识库问答 >
问题:

Java Hmac-Sha1与Nodejs不同的hexdigest

邵赞
2023-03-14
const body = JSON.stringify(require('./json-events/test-event.json'));
const crypto = require('crypto');

const digest = crypto.createHmac('sha1', secretKey)
    .update(body, 'utf8')
    .digest('hex');

console.log(digest);
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());
}
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)

但是,我看到的每一个地方,似乎NodeJS代码都是100%正确的。所以我猜我的Java和Python代码中存在一个共同的缺陷。

任何洞察力将非常感谢。

下面是一些我看过的其他网页;

更新:使用更简单的字符串“asdfghjkl”而不是复杂的JSON字符串,生成相同的签名。因此,在比较Java/Python和NodeJS时,似乎有一些不可见的字符在改变摘要。

共有1个答案

崔宇
2023-03-14

我找到了这个问题的解决方法(忘了在这里贴出答案)。当字典的键-值对的顺序不同时,签名也不同。这么简单的疏忽。

所以;

{
    "key1": "Value1",
    "key2": "Value2"
}

将生成不同的摘要字符串;

{
    "key2": "Value2",
    "key1": "Value1"
}
 类似资料:
  • 问题内容: 我从http://tools.ietf.org/html/rfc6238借用了HMAC- SHA1 Java代码,并稍加修改以对其进行硬编码,以使用一个具有已知输出的已知密钥/消息对。 然后,我尝试在Python中编写相同的代码以验证结果,但是在Python和Java中获得了不同的值。 已知Java值很好。 Java代码: Python代码: 运行Java的结果: 运行Python的结

  • 问题内容: 我从http://tools.ietf.org/html/rfc6238借用了HMAC- SHA1 Java代码,并稍加修改以对其进行硬编码,以使用一个具有已知输出的已知密钥/消息对。 然后,我尝试在Python中编写相同的代码以验证结果,但是在Python和Java中获得了不同的值。 Java值众所周知是好的。 Java代码: Python代码: 运行Java的结果: 运行Pytho

  • 问题内容: 我有一个包含用户名和密码的SQL表。密码使用MessageDigest的digest()方法进行编码。如果我使用MessageDigest的digest()方法对密码进行编码(比如说“ abcdef12”),然后将其转换为十六进制值,则该字符串与使用PHP的SHA1-方法进行的编码不同。我希望这些值可以完全相同。 用于编码密码的代码: 使用以下方法将String转换为十六进制: 密码:

  • 问题内容: 在C#中寻找与此方法相同的方法 问题答案: 在C#中超级简单:

  • 问题内容: 是否可以在同一台计算机上安装不同版本的NodeJS? 问题答案: 您可以使用几种节点管理器来实现此目的,但是最受欢迎的是: 虚拟机 ñ