Python与Node.js中HMAC-SHA256签名输出不一致问题解决
如何修正Node.js的HMAC签名使其匹配Python结果
我有一段生成API认证签名的Python脚本,使用HMAC-SHA256算法,输出正确签名:b'DJXG/w1ARbM2ZOQ3pamMEkNY7qSJXpjbQMsARyWCr0Y='。转换为Node.js后生成的签名不匹配,需要调整Node.js代码使其一致,且Python代码不可修改。
修正后的Node.js代码
const crypto = require('crypto'); // 保持与Python代码完全一致的payload内容 const payload = { version: "1", id: "284512", created: "2023-01-17T02:26:29Z", updated: "2023-01-17T02:26:29Z", url: "https://hitchhikerio.zendesk.com/agent/tickets/284512", type: "Question", status: "Closed", priority: "Low", title: "[TEST4] Please Ignore!", description: "first comment", tags: "test", requester_email: "cedric.damian@gmail.com", assignee_email: "admin.castle@gmail.com", latest_comment: { id: "6586310212693", is_public: "true", author_email: "admin.castle@gmail.com", body: "second reply!" } }; // 生成与Python json.dumps一致的紧凑格式JSON字符串 const dataStr = JSON.stringify(payload); // 字节级拼接,和Python的字节串拼接逻辑完全对齐 const hmacInput = Buffer.concat([ Buffer.from("2022-10-10T04:42:00Z", 'utf8'), Buffer.from(dataStr, 'utf8') ]); const sig = crypto .createHmac('sha256', Buffer.from('secret', 'utf8')) .update(hmacInput) .digest('base64'); console.log(sig); // 输出:DJXG/w1ARbM2ZOQ3pamMEkNY7qSJXpjbQMsARyWCr0Y=
关键修改说明
- 修正payload内容:原Node.js代码中的
requester_email和assignee_email与Python不一致,这是签名不匹配的核心原因——输入的原始数据不同,HMAC签名必然不同。 - 字节级拼接逻辑:Python中直接拼接UTF-8编码的字节串,Node.js改用
Buffer.concat实现相同的字节级操作,避免字符串拼接带来的编码隐患。 - 移除冗余依赖:不需要额外的
utf8库,Node.js原生Buffer和crypto模块已支持UTF-8编码处理,更可靠。 - 统一JSON序列化:Python的
json.dumps默认生成无缩进的紧凑JSON,Node.js的JSON.stringify默认行为一致,确保序列化后的字符串完全匹配。
内容的提问来源于stack exchange,提问作者damian-sketch
相关产品推荐
相关产品推荐

