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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:45:28