为什么解密 MD5 校验和如此容易

Why is it so easy to decrypt MD5 checksums

我最近一直在浏览一个将 MD5 格式转换为纯文本格式的网站。为什么这么容易解密?

举个例子

8466fa8e428bf83c4d2d9893b4bada64

7d53cbd3f0c0e2af31c3ba1eab940f22

dc647eb65e6711e155375218212b3964

27d4cf7da57f6748f79254f7be42cca3

909cea0c97058cfe2e3ea8d675cb08e1

在 1 秒内解密为 "My gmail password is orange"。 Picture

即使使用 sha256 也能立即解密 Picture

因为md5不是一种加密机制,是一种非常古老的单向散列算法。您发现的是碰撞,它们极不可能是原始输入。他们产生了 a 种可能的匹配。考虑

$ echo "My Gmail Password Is Orange" | md5sum
97ec87f89796b683feae88008c302d22  -
$ echo -n "My Gmail Password Is Orange" | md5sum
52b4551c065189631be8b506eee9b62e  -

这两个 String(s) 之间的唯一区别是换行符。确实md5坏了。但它是不可逆的,除非你考虑非常短的单词和字典。

md5是一种单向摘要函数,也称为散列函数。它不是一种加密机制。

md5 众所周知有几个弱点,十多年来普遍的建议是避免使用它。

在此特定站点上,您可能会看到彩虹 tables 用于查找碰撞的示例,甚至可能是原始输入。 Rainbow table 的工作原理是预先计算大量可能的输入(例如已知密码、多种语言的整个词典、常用词组合等)。这样的 table 可以有效地搜索给定的散列以找到产生所述散列的输入。

请注意,在某些情况下,您从彩虹 table 中收到的结果可能与您用作输入的结果不同。在这种情况下,它也是一个碰撞的例子。

可以使用加盐来防止彩虹攻击,它会向每个输入添加随机数据,因此预先计算的彩虹 table 不太可能包含您的确切输入。

虽然 md5 被认为是损坏的,但它并没有损坏到可以执行直接 "decryption" 给定散列的程度 - 大多数攻击都试图产生冲突,因为反对寻找原像。

对于任何安全敏感的应用程序,您应该考虑使用现代哈希函数,例如 sha256。对于密码哈希,可以考虑使用专门为密码哈希设计的哈希函数,例如bcrypt.