核心结构

HMAC的公式为:HMAC(K,m)=H( (K⊕opad) || H ( (K⊕ipad) || m) )

其中:

  • H:哈希函数(如SHA-256)。
  • K:密钥,需处理为与哈希函数块长度一致。
  • ipad = 00110110 (0x36) 不断循环直至达到散列函数分组长度
  • opad = 01011100 (0x5c) 不断循环直至达到散列函数分组长度
  • || :拼接操作。

密钥处理

  • 若 密钥长度 < Hash的分组长度:key = 密钥0000…(末尾填充0,直到长度达到Hash分组长度)
  • 若 密钥长度 > Hash的分组长度: key = Hash( 密钥 ) (将密钥进行单向散列的结果作为key)

计算步骤

  1. 生成内部填充:Si = K ⊕ ipad
  2. 计算内部哈希:InnerHash=H(Si || m )
  3. 生成外部填充:So = K ⊕ opad
  4. 计算最终HMAC:HMAC=H(So || InnerHash)

安全性

  1. 依赖哈希函数:安全性建立在哈希函数的抗碰撞性、抗第二原像攻击等特性上。
  2. 防御攻击:
    • 长度扩展攻击:外层哈希的密钥异或操作阻止攻击者构造合法HMAC。
    • 暴力破解:建议密钥长度≥128位(如16字节),并随机生成。

HMAC通过两次哈希和密钥混合,提供安全的认证机制。其设计兼顾效率与安全性,但需注意正确实现密钥处理、哈希算法选择及密钥管理,避免常见错误(如弱密钥、算法过时)