gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:40:30 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com