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=(',', ':'):去掉所有空格,生成压缩格式的JSONsort_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
相关产品推荐
相关产品推荐

