Merkle–Damgård 摘要就是处理完最后一个分组后的完整内部状态,因此攻击者可以加载这个状态并继续计算哈希。如果某个服务用 SHA-256(secret ‖ params) 认证请求,那么任何看到一个有效标签的人,都可以(在填充字节之后)追加 &admin=1,并为更长的消息算出有效标签。2009年,Flickr 基于 MD5 的 API 签名正是这样被攻破的。
不受影响的有:HMAC(外层哈希隐藏了内层状态)、SHA-3 和 SHAKE 系列函数(容量部分从不输出)、BLAKE2 和 BLAKE3,以及 SHA-384、SHA-512/256 等截断的 SHA-2 变体,它们的输出省略了部分状态。签名方案在签名前先对消息计算哈希,因此也不受影响。
规则很简单:切勿用 SHA-1 或 SHA-256 按 hash(key ‖ message) 的方式构造 MAC;应使用 HMAC、KMAC 或带密钥的 BLAKE2。