6. 安全性 (Security)
本文提出的消息认证机制的安全性取决于散列函数 H 的密码学属性: 对碰撞查找的抵抗力 (仅限于初始值是秘密和随机的, 且函数的输出对攻击者不明确可用的情况), 以及 H 的压缩函数在应用于单个块时的消息认证属性 (在 HMAC 中, 这些块对攻击者部分未知, 因为它们包含内部 H 计算的结果, 特别是不能被攻击者完全选择)。
这些属性, 实际上是更强的属性, 通常被假设用于与 HMAC 一起使用的那类散列函数。特别是, 上述属性不成立的散列函数将不适合大多数 (可能是所有) 密码学应用, 包括基于此类函数的替代消息认证方案。(有关 HMAC 函数的完整分析和原理, 读者可参考 [BCK1]。)
鉴于迄今为止对候选散列函数密码学强度的有限信心, 重要的是观察 HMAC 构造及其用于消息认证的安全使用的以下两个属性:
-
该构造独立于所使用的特定散列函数 H 的细节, 因此后者可以被任何其他安全的 (迭代) 密码散列函数替换。
-
消息认证与加密相比具有"短暂"效果。公开破解消息认证方案将导致该方案的替换, 但对过去认证的信息没有对抗性影响。这与加密形成鲜明对比, 在加密中, 如果加密算法被破解, 今天加密的信息将来可能面临暴露。
针对 HMAC 的最强已知攻击基于散列函数 H 的碰撞频率 ("生日攻击") [PV,BCK2], 对于最低限度合理的散列函数来说完全不切实际。
例如, 如果我们考虑像 MD5 这样输出长度等于 L=16 字节 (128 位) 的散列函数, 攻击者需要获取在大约 264 个已知明文上计算的正确消息认证标签 (使用_相同的_密钥 K!)。这将需要在 H 下处理至少 264 个块, 在任何现实场景中都是不可能的任务 (对于 64 字节的块长度, 这将在连续 1Gbps 链路上花费 250,000 年, 并且在此期间不更改密钥 K)。只有在发现函数 H 的碰撞行为存在严重缺陷时 (例如, 在 2**30 条消息后发现碰撞), 这种攻击才可能变得现实。这样的发现将决定立即替换函数 H (此类失败的影响对于 H 在数字签名、公钥证书等上下文中的传统使用将更为严重)。
注意: 这种攻击需要与常规密码散列函数碰撞攻击形成强烈对比, 在常规攻击中不涉及密钥, 且 264 次离线可并行化 (!) 操作足以找到碰撞。后一种攻击正在接近可行性 [VW], 而对 HMAC 的生日攻击完全不切实际。(在上述示例中, 如果使用具有 160 位输出的散列函数, 则 264 应替换为 2**80。)
上述构造的正确实现、随机 (或密码学伪随机) 密钥的选择、安全的密钥交换机制、频繁的密钥刷新以及对密钥的良好保密保护都是 HMAC 提供的完整性验证机制安全性的基本要素。