java - Node HMAC 结果不同于 Ruby 和 Java

标签 java node.js ruby algorithm node-crypto

我有 2 个用于第 3 方 API 的 HMAC 散列的现有实现。 Java 和 Ruby 在执行 SHA1 或 SHA256 时完美匹配,但 Node 也不匹配。在 Node 中实现的代码看起来简单明了,所以我不确定区别在哪里。

在 ruby 中:

def calculateRFC2104HMAC(canonicalizedData, accessKey, algorithm)
  digest = OpenSSL::Digest.new(algorithm)
  hmac = OpenSSL::HMAC.digest(digest, accessKey, canonicalizedData)

  return Base64.encode64(hmac)
end
# SHA1: SCN+L/M/nwwbk90VXBmEPe+18RU=
# SHA256: hgY38OlBKRsFlcBYAiX94blJPisXTIr08rvZDc7Ljhk=

在 Java 中:

private static String calculateRFC2104HMAC(String data,String 
    accessKey,String algorithm) {

   SecretKeySpec signingKey=null;
   byte[]rawHmac=null;
   // get an hmac_sha256 key from the raw key bytes
   signingKey=new SecretKeySpec(accessKey.getBytes(), 
     algorithm);

   // get an hmac_sha256 Mac instance and initialize with the signing key
   Mac mac=Mac.getInstance(algorithm);
   mac.init(signingKey);
   // compute the hmac on input data bytes
   rawHmac=mac.doFinal(data.getBytes());

   // base64-encode the HMAC
   return new String(Base64.encodeBase64(rawHmac));
}
# SHA1: SCN+L/M/nwwbk90VXBmEPe+18RU=
# SHA256: hgY38OlBKRsFlcBYAiX94blJPisXTIr08rvZDc7Ljhk=

在 Node 中:

_calculateRFC2104HMAC = ({canonicalizedData, accessKey, algorithm}) => {
    const hmac = crypto.createHmac(algorithm, accessKey);
    hmac.update(canonicalizedData);

    const hash = hmac.digest('base64');

    return hash;
};
# SHA1: GspTWly+Ezh2aW/QkKZA1o+qHRg=
# SHA256: FjVQ1Uj7866QZUv+jgLz/OahPbtPGEXpGwBbioqtBec=

我已验证 key 和数据是相同的。

编辑:看起来问题出在行尾。我们构建的数据必须用\n 换行分隔。这在 Java 和 Ruby 中都可以很好地完成。但是在 Node 中相同的\n 使得 hash 不同并且请求失败。

最佳答案

看起来问题是需求冲突。他们想要一个\n 来分隔参数并将它也包含在最后一对中。但他们还希望修剪所有空白区域。

如果修剪是在最后完成的,它就是删除最后一个\n。修剪需要在构建对时完成,同时在所有对上留下\n,包括最后一个。

关于java - Node HMAC 结果不同于 Ruby 和 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51736798/

相关文章:

java - 如何在网页中的特定 div 中垂直向下滚动

java - 未发送 Cognito 电子邮件验证

java - 为什么安装了Java JDK之后还需要安装JRE

javascript - Node JS - 文件生成器架构

javascript - 如何根据 Express 参数检索 Mongoose 模型

Ruby 声称 ""实际上不是一个空格?

ruby-on-rails - 如何将 CanCan 与 Grape 搭配使用?

java - JAX-RS + RESTEasy 服务返回不带双引号的 JSON 字符串

mongodb - Nodejs - websocket-node 模块 : How to make multi-client socket-server works?

ruby - 安装 SASS gem 时出错 - 没有权限