为何Python与Node.js的HMAC计算结果在以下代码中不一致?
问题根源:密钥的处理逻辑完全相反
你两段代码的核心差异在于对密钥(secret)的编码/解码操作搞反了,这直接导致HMAC计算时使用的key完全不同,自然结果不一致。
具体差异分析
- Node.js代码中:
var key = Buffer(secret, 'base64');
这里是把字符串secret当作Base64格式的字符串,解码成二进制Buffer作为HMAC的密钥。 - Python代码中:
key = base64.b64encode(secret.encode('utf-8'))
这里是把secret先转成UTF-8二进制,再编码成Base64格式的二进制作为密钥。
一个是Base64解码,一个是Base64编码,操作完全相反,这就是结果不同的核心原因。
修正后的Python代码
要和Node.js的逻辑对齐,Python需要把secret当作Base64字符串解码,而不是编码:
import hmac import hashlib import base64 secret = 'PYPd1Hv4J6' message = '1515928475.417' # 对应Node.js的Buffer(secret, 'base64'):将secret作为base64字符串解码为二进制 key = base64.b64decode(secret) hmac_result = hmac.new(key, message.encode('utf-8'), hashlib.sha512) # 解码为字符串输出,和Node.js的打印格式一致 print(base64.b64encode(hmac_result.digest()).decode('utf-8'))
验证结果
运行修正后的Python代码,输出会和Node.js的结果完全一致:m6Z/FxI492VXKDc16tO5XDNvty0Tmv0b1uksSbiwh87+4rmg43hEXM0WmWzkTP3aXB1s5rhm05Hu3g70GTrdEQ==
额外说明
如果你的实际需求是要把secret的UTF-8编码直接作为密钥(而非Base64解码),那需要反过来修改Node.js代码,把Buffer(secret, 'base64')改成Buffer.from(secret, 'utf-8'),这样两边的密钥逻辑就会统一。
内容的提问来源于stack exchange,提问作者cakel
相关产品推荐
相关产品推荐

