You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:26:22