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

将HMAC-SHA1从node.js转换为Java

岳晟
2023-03-14

我的任务是将一些现有的node.js代码转换为Java。我想我已经在路上了,但我现在有点卡住了。方法的输出似乎不匹配。

我所做的是基于查询字符串创建SHA-1签名。这个查询字符串包含一些与查询相关的数据(与这个问题无关)和一个API键。

重要

    null
const hmac = crypto.createHmac('sha1', api_secret);

SHA-1 mac在Java中的初始化如下:

final SecretKeySpec secretKeySpec = new SecretKeySpec(Config.API_SECRET.getBytes("UTF-8"), "HmacSHA1");
final Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(secretKeySpec);

接下来,node.js程序更新hmac(query参数如上所列):

hmac.update(query, 'ascii');

我在Java中这样复制了它(query参数等于node.jsquery参数):

hmac.update(query.getBytes("US-ASCII"));
const signature = hmac.digest('hex');
public static String byteArrayToHex(byte[] a) {
    StringBuilder sb = new StringBuilder(a.length * 2);
    for(byte b: a)
        sb.append(String.format("%02x", b & 0xff));
    return sb.toString();
}

实际使用情况

byte[] result = hmac.doFinal();
MessageDigest md = MessageDigest.getInstance("SHA-1");
String sha1Hash = byteArrayToHex(md.digest(result));

然而,这正是我感到困惑的地方。node.js程序返回以下哈希:18cf4fce7bd6163c64d3b2ea8d935b0f16720fe3

但我的Java程序将此哈希作为输出:F65F8738CCE89134DC73709E3353D94C83CCF1FB

共有1个答案

华飞驰
2023-03-14

我想出来了!

结果我做了一个不必要的步骤。

这一行:

byte[] result = mac.doFinal();
byte[] result = mac.doFinal();
return byteArrayToHex(result);
 类似资料:
  • 问题内容: 我从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

  • 问题内容: 我想创建一个(用键签名)的哈希 如何使用Node.js Crypto创建该哈希? 问题答案: 加密文档:http : //nodejs.org/api/crypto.html

  • 问题内容: 我正在尝试使用网站的OAuth,该网站要求签名方法仅是“ HMAC-SHA1”。 我想知道如何在Python中实现此功能? 问题答案: 假单胞菌: 签名错误通常驻留在基本字符串中,请确保您理解这一点(如OAuth1.0规范在此处所述:http://tools.ietf.org/html/draft-hammer- oauth-10#section-3.4 。 1)。 以下输入用于生成签

  • 我有一把钥匙: 信息: 十六进制的hmac输出: 因此,如果我创建一个新的BigInteger(测试),如: 如果我想得到十六进制值,比如: 我明白了: 问题出在哪里?或者,如何从消息中计算hmac-sha256并使用Beginning中的大整数。 key、message和hmac是字节数组。 如果我尝试将字节“11010100”转换为Bigintger,它会转换为负“-101100”为什么Big