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

Python对字典生成HMAC-SHA1哈希与PHP结果不一致,是什么原因?

问题根因

结果不一致核心原因是Python与PHP的JSON序列化默认规则存在差异,参与HMAC计算的原始字符串本质不同:

  • Python的json.dumps默认会在键值对的冒号后、字典元素的逗号后添加多余空格,你示例中序列化输出结果为:{"name": "Andrew", "color": "white"}
  • PHP的json_encode默认无多余空格,你示例中序列化输出结果为:{"name":"Andrew","color":"white"}
修正方案

调用json.dumps时添加separators参数,手动指定分隔符无多余空格即可,若要避免字典键顺序不同导致的序列化差异,可额外添加sort_keys=True强制按键名升序序列化:

import hmac
import json
from hashlib import sha1

secret = "1b87e199bb4791db3f0920784e14c91df6c83df9"
dic = {'name':'Andrew',
       'color':'white'}
# 核心修改:指定separators去掉多余空格,可选添加sort_keys=True保证键顺序一致
sign = hmac.new(
    secret.encode('utf-8'),
    json.dumps(dic, separators=(',', ':'), sort_keys=True).encode('utf-8'),
    sha1
).hexdigest()

修改后计算得到的签名为d6b6305ebc39b44d10160c80a95f65faff0167b9,和PHP端结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 09:27:02