Merkle-Damgård 结构
Merkle-Damgård 结构是 MD5、SHA-1、SHA-2 等经典哈希函数的基础框架。
工作原理
- 填充:将消息填充到块大小的整数倍,最后包含原始消息长度(长度填充/Merkle-Damgård strengthening)
- 分块:将填充后的消息分成 n 个固定大小的块 M₁, M₂, ..., Mn
- 迭代压缩:h₀ = IV(初始值),hi = f(hi-1, Mi),其中 f 是压缩函数
- 输出:最终状态 hn 作为哈希值
安全证明
如果压缩函数 f 是抗碰撞的,那么整个 Merkle-Damgård 哈希函数也是抗碰撞的。
局限性
- 长度扩展攻击(Length Extension Attack):知道 H(M) 和 len(M) 但不知道 M 本身,可以计算 H(M || padding || M') 的值。因为攻击者可以从 H(M) 恢复内部状态,然后继续处理新数据。
- 多碰撞攻击:可以以相对低的代价构造 2k 个消息的碰撞组。
长度扩展攻击与防御
攻击原理
假设服务器验证方式为 H(secret || message)。攻击者知道 message 和 H(secret || message),但不知道 secret。
利用 Merkle-Damgård 结构,攻击者可以:
- 从 H(secret || message) 恢复压缩函数的内部状态
- 追加 padding + 任意数据 M'
- 计算出 H(secret || message || padding || M')
无需知道 secret 就能伪造有效的 MAC。
防御方法
- HMAC:H(K, H(K, M)),双层哈希防止长度扩展
- SHA-3 / 海绵结构:天然免疫
- 截断输出:不暴露完整内部状态
海绵结构(Sponge Construction)
SHA-3 采用的结构,解决了 Merkle-Damgård 的固有弱点。
参数
- 状态大小 b = r + c(比特率 + 容量)
- SHA-3-256:b = 1600, r = 1088, c = 512
优势
- 天然免疫长度扩展攻击
- 可变长度输出(XOF 模式)
- 安全性证明更简洁
- 一个置换函数可用于哈希、MAC、流密码等多种用途
生日攻击
利用生日悖论对哈希函数进行碰撞搜索:
- 生成 2n/2 个不同的消息
- 计算每个消息的哈希值
- 检查是否有两个消息的哈希值相同
这是理论最优的通用碰撞攻击。对于 n 位哈希函数,需要约 2n/2 次哈希计算和 2n/2 的存储。
改进:Pollard's Rho 方法
空间复杂度从 O(2n/2) 降到 O(1),时间复杂度不变。使用 Floyd 环检测算法找到碰撞。
差分密码分析
研究输入差异如何传播到输出差异。
对于哈希函数:寻找一对输入 M 和 M' 使得 H(M) 和 H(M') 满足特定的差分关系。
王小云的 MD5 攻击正是差分分析的杰作:找到了一条经过全部轮函数的差分路径,使得碰撞概率远高于随机期望。
差分分析的关键步骤:
- 选择输入差分 ΔM
- 追踪差分在轮函数中的传播(差分路径)
- 计算满足该路径的概率
- 若概率足够高,可以高效搜索碰撞
线性密码分析
寻找输入比特、输出比特之间的线性近似关系。
对于哈希函数:寻找一组输入比特和输出比特的线性组合,使其偏移显著偏离 1/2。
线性分析通常与差分分析结合使用,用于评估压缩函数的非线性程度。