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
相关产品推荐
相关产品推荐

