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

Python HMAC SHA-256生成结果与第三方网站不一致问题求助

解决Python HMAC SHA-256与第三方计算结果不一致的问题

核心问题出在JSON字符串的格式化差异:第三方网站使用的是无空格压缩格式+键保持原始顺序的JSON字符串,而你之前用的str()、repr()或默认json.dumps()都会引入额外空格或改变键顺序,导致最终哈希输入不一致。

解决方案1:直接使用原始JSON字符串

直接用目标网站提供的原始JSON作为哈希输入,完全避免序列化差异:

import hmac, hashlib

# 直接复制原始JSON字符串,确保内容与网站完全一致
message = '{"event":"transaction:status_update","date":"2017-08-30T13:47:42+00:00","transactions":[{"id":"asdlfjasdf93","state":"COMPLETED","label":"Marked as review"},{"id":"fd09dfad8df9","state":"REVOKED","label":"Review complete."}]}'

signature = hmac.new(
    bytes('mykey', 'utf-8'),
    msg=message.encode('utf-8'),
    digestmod=hashlib.sha256
).hexdigest()

print(signature)

解决方案2:从字典严格序列化生成匹配的JSON字符串

如果必须从Python字典生成JSON,需通过json.dumps()的参数严格控制格式:

  • separators=(',', ':'):去掉所有空格,生成压缩格式的JSON
  • sort_keys=False:保持键的原始顺序(Python3.7+字典默认保留插入顺序,需确保字典键顺序与原始JSON一致)
  • ensure_ascii=False:避免转义非ASCII字符,与原始JSON格式对齐

示例代码:

import hmac, hashlib
import json

# 按原始JSON的键顺序构建字典
json_obj = {
    "event": "transaction:status_update",
    "date": "2017-08-30T13:47:42+00:00",
    "transactions": [
        {"id": "asdlfjasdf93", "state": "COMPLETED", "label": "Marked as review"},
        {"id": "fd09dfad8df9", "state": "REVOKED", "label": "Review complete."}
    ]
}

# 生成与原始JSON完全一致的压缩字符串
message = json.dumps(json_obj, ensure_ascii=False, separators=(',', ':'), sort_keys=False)

signature = hmac.new(
    bytes('mykey', 'utf-8'),
    msg=message.encode('utf-8'),
    digestmod=hashlib.sha256
).hexdigest()

print(signature)

为什么之前的方法无效?

  • str(json_obj)/repr(json_obj):会生成带空格的非标准JSON字符串,格式与网站要求不符
  • 默认json.dumps(json_obj):会在逗号、冒号后自动添加空格,导致输入字符串的长度和内容与网站的不一致,最终HMAC结果必然不同

内容的提问来源于stack exchange,提问作者Karl Davidson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:57:44