HMAC(RFC 2104)是基于哈希函数构造的消息认证码,用于验证消息完整性与来源真实性。结构为 HMAC(K,m) = H((K'⊕opad) ∥ H((K'⊕ipad) ∥ m)),即内外两次哈希、用两个固定填充常量把密钥混合进不同位置。
朴素的 H(K ∥ m) 不安全,根源在 Merkle–Damgård 结构哈希(MD5/SHA-1/SHA-2)的长度扩展攻击:哈希输出就是内部状态,攻击者拿到 H(K∥m) 后,不知道 K 也能从该状态继续压缩,构造出 H(K∥m∥padding∥m') 的合法值,即在消息后追加任意内容并伪造签名。经典场景:URL 签名 sign=md5(secret+params) 被追加参数绕过。HMAC 的双层结构让外层输入为固定长度哈希值,攻击者无法接触内层状态,免疫此类攻击。
实践要点:消息认证一律用现成 HMAC,禁止自创拼接;SHA-3(海绵结构)天然免疫长度扩展,但接口签名仍建议 HMAC-SHA-256;验签比较用常数时间函数防时序侧信道;API 签名应纳入时间戳与 nonce 防重放。追问方向:HMAC vs 数字签名(共享密钥 vs 不可否认性)、时序攻击原理。