为什么 MD5 被认为是易受攻击的算法?

信息安全 哈希 md5 算法
2021-09-01 17:58:51

我知道 MD5 是最容易受到攻击的哈希算法,尤其容易受到冲突的影响。但是碰撞漏洞并不是很危险,有人可能会利用它作为优势,但这完全是运气。

好的,假设我使用 MD5 存储密码。这里有一些冲突的字符串:https ://crypto.stackexchange.com/questions/1434/are-there-two-known-strings-which-have-the-same-md5-hash-value 但不太可能用户可能会使用这些字符串作为他的密码。这就是为什么它取决于运气。

现在,假设用户使用了这些字符串之一。攻击者要利用这个碰撞漏洞,他/她必须知道原始密码并且知道它还有另一个碰撞字符串。但是如果攻击者已经知道原始密码,为什么还要麻烦碰撞呢?攻击者有什么办法可以利用这一点?

2个回答

我知道 MD5 是最易受攻击的哈希算法

从技术上讲(我们在这里是技术性的)有比 MD5 更糟糕的算法。

并且特别容易受到碰撞

是的,人们可以使用不同的明文创建所需的散列。这不太可能随机发生,但可能是恶意发生的。

但是碰撞漏洞并不是很危险,有人可能会利用它作为优势,但这完全是运气。

不是纯粹的运气。有一些技术可以找到产生所需 MD5 的明文。对于不同的问题,这是一个很好的主题。

好的,假设我使用 MD5 存储密码。

哎哟。您不应该使用 MD5 的主要原因是因为它是通用(快速)哈希

您应该使用(慢)密码哈希,例如

  • 通常推荐使用 BCrypt,但请务必对输入数据运行快速 SHA-2 哈希,这样超长密码不会被 BCrypt 截断
  • PBKDF2,但它对 GPU 的抵抗力较低,因为它的内存要求较低。
  • 如果你有足够高的工作系数,SCrypt 比 BCrypt 更好。否则对 GPU 来说会更糟。(同样,由于更高或更低的内存要求)
  • 密码哈希比赛的获胜者可能比前面提到的还要好,但还没有经受住时间的考验,所以暂时不要使用它。它被称为 Argon2,并且有单独的 CPU 时间和内存负载的工作因子设置。(好的!)
  • 可以使用重复的 SHA-2 代替 PBKDF2(仍然不是 GPU 抗性),但是要有效地实现重复(即抗蛮力)更加棘手,因为 SHA-2 实际上是通用(快速)哈希。

这些选项中的大多数默认生成随机 Salt,但您应该验证是否是这种情况!

最好在散列之前在密码之前包含一些 Pepper(约 72 位熵)。Pepper 对于您的所有用户可以是相同的,但应该存储在数据库外部的文件中,以便无法通过 SQL 注入找到组件。

确保您的工作因素在您的目标硬件上需要大约 100 毫秒(具有适当的 DoS 保护)(知道攻击者将使用更快的硬件进行暴力破解)

当然,没有多少散列可以保护弱passwords,所以包括密码强度要求。

碰撞漏洞......攻击者有什么办法可以利用它作为优势?

在密码哈希存储的上下文中,这可能对攻击者没有帮助。

如今哈希算法受到攻击的主要原因与密码无关。我相信 MD5 在密码散列方面仍然相当安全。前提是您使用盐来击败彩虹表并多次迭代算法以减慢蛮力猜测(但是您确实应该改用标准算法)。问题分别在于数字签名或 X.509 证书。

10 年来,使用 md5 对签名进行“选择前缀攻击”。在 2006 年或 2007 年,来自埃因霍温技术大学的 Arjen Lenstra 团队创建了一个流氓证书,该证书具有与商业 CA 颁发的相同的 MD5 哈希值。该攻击需要强大的计算能力,并且设置非常复杂,但结果是 MD5 遭到破坏。这里这里

同样的技术也被用于著名的 FLAME 攻击。

正如您正确注意到的那样,当涉及到密码哈希时,情况完全不同,因为需要在不知道纯文本的情况下生成冲突。当涉及到数字签名时,明文通常是已知的,当然这会打开额外的攻击向量,如上面引用的工作所示。