首页/安全/加密与证书速查/HMAC 与「哈希拼接密钥」的区别
加密算法基础95 条

HMAC 与「哈希拼接密钥」的区别

直接用 H(key || message) 校验消息存在长度扩展风险;HMAC 的双层结构(ipad/opad)避免了该问题,是标准的密钥化哈希构造。

加密与证书速查安全更新于 2026-10-12
反例sha256(secret + message):可被长度扩展利用
正例HMAC-SHA256(RFC 2104 构造)
替代SHA-3/BLAKE2 的海绵/树结构天然抗长度扩展
比较使用 hmac.compare_digest 做常量时间校验

正反例对照(Python)

正反例对照(Python)
import hashlib, hmac
# 反例:不要这样校验来源
bad = hashlib.sha256(secret + msg).hexdigest()
# 正例
good = hmac.new(secret, msg, hashlib.sha256).hexdigest()
hmac.compare_digest(good, received)
许多 Webhook 与开放平台使用 HMAC-SHA256 作为签名算法,对接时应严格按文档构造待签串并做常量时间比较。

易错点

  • 把密钥放消息后面(H(message || key))也不规范,应统一用 HMAC
  • 拼接 JSON 做签名串时字段顺序与空格必须与文档一致,否则校验必失败

数据来源与参考

  • RFC 2104 §2(HMAC 设计动机)
  • FIPS 198-1
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌