首页/安全/加密与证书速查/长度扩展与哈希构造选择
加密算法基础95 条

长度扩展与哈希构造选择

对 Merkle–Damgård 类哈希(MD5/SHA-1/SHA-2),在只知道 H(secret||msg) 与长度时可推导出更长消息的摘要;HMAC 与 SHA-3/BLAKE2 不受影响。

加密与证书速查安全更新于 2026-10-12
受影响MD5、SHA-1、SHA-2(Merkle–Damgård 结构)
不受影响SHA-3、SHAKE、BLAKE2(海绵/树结构)
防护用 HMAC 构造密钥化认证,或改用 SHA-3/BLAKE2
典型误用以 sha256(secret + data) 作为签名

安全写法(Python)

安全写法(Python)
import hmac, hashlib
# 不要:hashlib.sha256(secret + data)
# 使用 HMAC 构造
tag = hmac.new(secret, data, hashlib.sha256).hexdigest()
该问题只影响「密钥与消息拼接」的自研构造;标准协议与成熟库的 HMAC 实现不受影响。

易错点

  • 把哈希当 MAC 用时容易忽略密钥前缀构造的顺序问题,审计时重点看拼接方式
  • 改用 SHA-3 可规避该问题,但协议对接需双方同时升级

数据来源与参考

  • RFC 2104(HMAC 设计与长度扩展背景)
  • FIPS 202(海绵结构差异)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌