比较外部传入的HMAC摘要时,Python官方建议使用hmac.compare_digest而不是普通相等比较,以减少基于内容提前结束比较带来的时间分析风险。但这并不等于整个接口已经具备恒定响应时间。

它解决的是比较这一步
验签通常先用约定的密钥、原始消息和算法算出预期摘要,再与收到的值比较。普通比较是否相等只是功能结果;安全比较还关注执行过程是否随匹配前缀变化。不要把计时防护误写成“对数据进行了加密”。
import hmac
# Public fixture, never a production secret.
key = b"public-test-key"
message = b"event=demo"
expected = hmac.digest(key, message, "sha256")
received = bytes(expected)
changed = bytes([expected[0] ^ 1]) + expected[1:]
assert hmac.compare_digest(expected, received)
assert not hmac.compare_digest(expected, changed)
assert not hmac.compare_digest(expected, b"")
print("comparison cases passed")
先统一双方的表示方式
示例两端都是原始摘要字节。若协议使用十六进制文本,就按协议验证编码,再以同一表示比较。官方要求双方类型一致,字符串形式仅支持ASCII。不要一边传hex文本,另一边传原始bytes,最后把类型错误当作签名不一致。
格式错误与长度差异也要处理
文档指出,不同长度或错误仍可能透露类型、长度等信息,因此不能由这个函数推断端点所有路径耗时相同。先限定协议允许的格式和大小,并用统一、清楚的失败处理;不要把密钥或完整凭据写进日志。
还缺哪些安全条件
比较函数不验证时间戳、不阻止重放,也不判断事件是否有权执行。真实Webhook还要检查签名所覆盖的字节、协议中的时效与去重规则,以及成功校验后的业务授权。本地练习只确认匹配、不匹配和空值结果,没有实施计时攻击或证明服务达到恒定时间。
资料来源与继续学习
资料查阅日期:2026年10月15日。示例、阅读练习与操作建议由本站整理。
资料查阅与编辑日期:2026年10月15日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END








