节点HMAC结果不同于Ruby和Java

时间:2018-08-07 23:36:12

标签: java node.js ruby algorithm node-crypto

我有3个第三方API的HMAC哈希的2种现有实现。执行SHA1或SHA256时,Java和Ruby完全匹配,但是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=

在节点中:

_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=

我已经确认密钥和数据相同。

编辑:看起来问题出在行尾。我们构建的数据必须用\ n行返回分隔。这在Java和Ruby中都可以完成。但是Node中相同的\ n使得哈希值有所不同,并且请求失败。

1 个答案:

答案 0 :(得分:0)

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

如果修剪在最后完成,则将删除最后一个\ n。修剪需要在构建线对的同时进行,同时在所有线对上都保留\ n,包括最后一对。