为什么解密 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.
我最近一直在浏览一个将 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.