我目前在 Python 中有这个代码片段 -
import base64
import hashlib
import hmac
def hash_hmac(self, key, data):
res = hmac.new(base64.b64decode(key), data.encode(), hashlib.sha512).digest()
return res
我尝试在 Node.js 中复制它,但很难获得正确的哈希值。
const crypto = require('crypto')
const hashHmac = (key, message) => {
return crypto.createHmac('sha512', Buffer.from(key, 'base64').toString('utf-8'))
.update(message)
.digest()
.toString('base64')
}
测试用例: key :“7pgj8Dm6” 消息:'测试\0消息'
使用 python 代码片段,哈希为
69H45OZkKcmR9LOszbajUUPGkGT8IqasGPAWqW/1stGC2Mex2qhIB6aDbuoy7eGfMsaZiU8Y0lO3mQxlsWNPrw==
使用 js 片段,哈希为
OhaJU9IibhhjIjz3R7FmodgOBUPjwhndXX8gn0r2rRzjQvCJl4T40rHXKw3o6Y2JQ5fVHTeStu8K1DRMWxMGBg==
我的base64编码有问题吗?
最佳答案
在NodeJS代码中, key 首先经过Base64解码,然后经过UTF-8解码。由于 key 包含UTF-8未定义的字节序列,因此 key 被损坏。
任意二进制数据,例如密文、散列或 key (至少是随机生成的),必须以二进制或 binary-to-text encoding 形式存储。如果要将它们转换为字符串,则必须使用 Base64(而不是像 UTF-8 这样的字符集编码),另请参阅 here .
在发布的示例中,根本不需要将缓冲区转换为字符串。 key 可以简单地作为缓冲区 s 直接传递。 crypto.createHmac()
,即如下:
var hmac = crypto.createHmac('sha512', Buffer.from(key, 'base64'));
这样,NodeJS 代码将返回与 Python 代码相同的结果。
关于python - Node.js 中等效的 HMAC SHA-512 哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68220072/