密码散列适用于原像抗性:密码散列过程应该使得找到与给定输出(散列)匹配的输入(密码)在计算上是不可行的,通过尝试大量潜在输入和“幸运”来保存. “幸运”攻击仍然是一个问题,因为密码是由人类用户选择的,他们并不像人们希望的那样富有想象力和随机性;这就是为什么我们需要的不仅仅是一个简单的散列函数(我们需要盐,我们需要慢度;见这个)。但是,冲突对密码散列的安全性没有影响。随意产生碰撞的能力不会给攻击者额外的破解能力。
正如其他人指出的那样,冲突可用于涉及签名的其他设置中的攻击。在这些情况下,攻击者可以:
- 生成冲突的消息对,对这些消息的格式进行充分控制,以使一条消息看起来“无辜”,而另一条则适合攻击者的目标;
- 让看似无辜的消息由第三方签名,其签名功能从“按原样”散列消息开始。
在这两种情况下,第三方都将生成签名,该签名对于两个消息都是有效的(就签名验证者而言)。这就像让签名者在不向签名者显示的情况下对消息发出签名一样。2008 年进行了一次演示,“消息”是 X.509 证书,签名者是证书颁发机构。在Flame 恶意软件中完成了相同概念的实际应用。
需要指出的一点是,尽管原始签名容易受到冲突的影响,如上所述,但可以通过让签名者在其签名的开头包含一些随机性来保护它们。在伪造 X.509 证书的情况下,攻击者必须能够预测证书的所有位,直至公钥;这包括CA 选择的证书序列号。如果 CA 使用大的随机序列号,那么即使使用 MD5 作为哈希函数,攻击也不适用。另一方面,使用顺序或基于时间的序列号的 CA 是可预测的。
另一个对碰撞的担忧是关于安全证明。在协议中使用的密码原语的某些特定假设下,可以证明某些密码协议是安全的;例如,一些使用散列函数的协议可以被证明是安全的,只要散列函数被假定为抗冲突或其他属性。一个例子是HMAC。HMAC 重用底层散列函数,并被设计为适应Merkle-Damgård 说服的散列函数,特别是 MD5 和整个 SHA 系列。这种散列函数是围绕内部“压缩函数”构建的。在假设压缩函数表现得像一个伪随机函数的情况下,HMAC 已被证明是安全的。
但是,如果 MD5 的压缩函数是 PRF,那么计算平均成本低于 2 64的 MD5 的碰撞是不可行的。我们知道如何产生 MD5 碰撞的成本远低于此。这意味着 MD5 压缩函数不是PRF。因此,这使 HMAC/MD5 上的安全证明无效。
这并不意味着我们知道如何通过碰撞来破坏 HMAC/MD5!“只是”,我们拥有的任何数学上的安全保证都像晨露一样在无情的正午阳光下蒸发了。在这方面,MD5 碰撞不是攻击者可以利用的工具,但仍然值得关注。