如果 MD5 自 1996 年以来被证明很弱,为什么人们仍然使用/推荐它?

信息安全 Web应用程序 密码 哈希 电子签名 md5
2021-08-23 09:22:58

即使在 1996 年已经证明了它的不安全性,它仍然是一种普遍推荐的散列密码方式:

因此,我们建议将来不要在签名方案等需要抗冲突哈希函数的应用程序中实现 MD5。根据我们目前的知识,替代 MD5 的最佳建议是 SHA-1 和 RIPEMD-160。

(最近一次攻击后 MD5 的状态,CryptoBytes,RSA 实验室,第 2 卷,第 2 期 — 1996 年夏季)

即使在这项研究以及所有即将发表的关于其缺陷的论文之后,它也一直被推荐为 Web 应用程序中的密码散列函数,从那时起。

它甚至用于一些证书颁发机构的数字签名(根据下面的 rhmrisk 链接)

为什么出于安全目的没有禁止此消息摘要算法的原因是什么?


链接:

4个回答

为了补充@DW 的好答案:对于密码散列,MD5 并不比任何其他散列函数更坏(但不要使用它)


全景图:MD5是一种加密哈希函数,因此,它有望满足三个特征:

  • 对原像的抵抗:给定x,找到m使得MD5(m) = x是不可行的。
  • 抵抗第二原像:给定m,找到与 m不同的m '并且使得MD5(m) = MD5(m')是不可行的。
  • 抗碰撞性:不可能找到彼此不同的mm',并且MD5(m) = MD5(m')

MD5 在碰撞方面被彻底破坏,但对于原像或第二原像却没有。此外,1996 年的攻击(由 Dobbertin 发起)根本没有破解 MD5。这是“压缩功能上的冲突”,即对 MD5 内部元素之一的攻击,但不是完整功能。密码学家将其视为警告标志,他们是正确的,因为 2004 年(由 Wang)发表的实际碰撞攻击是根据 Dobbertin 的发现构建的。但是MD5是在2004年才被破解的,不是1996年,而且是碰撞攻击

冲突与密码哈希安全无关。密码散列的散列函数的大多数用法取决于原像抗性或其他属性(例如,散列函数在HMAC中使用时的工作情况,不能简化为上述任何属性)。MD5 在原像方面实际上已经“弱化”了,但只是在理论上,因为攻击成本仍然是数十亿倍的昂贵成本,无法真正尝试(因此 MD5 在原像方面并没有“真正”被破坏,不是以实际的方式)。

但是无论如何不要使用MD5不是因为任何加密弱点,而是因为 MD5 是无盐非常快的。这正是您在密码散列函数中不想要的。“推荐 MD5”用于密码散列的人只是不知道更好,他们证明了您应该始终牢记的真理:并非您在 Internet 上找到的所有内容都是正确且值得信赖的。已知更好的密码散列解决方案,并且已经使用和部署了十多年。有关详细信息和指示,请参阅此答案

“禁止”是什么意思?谁会“禁止”使用 MD5?不像我们有一些国际加密警察去逮捕使用 ROT13 和其他不安全加密方案的人。

或者,更严肃一点:密码学家已经建议新系统应该避免使用 MD5,并且他们建议现有系统应该从 MD5 迁移出去。我不知道你认为密码学家还能做些什么。

您声称 MD5 是“常用的散列密码方法”,但您没有提供任何证据证明这一说法。我不认为这种说法是正确的。那不是我的经验。

最重要的是,加密社区已经在这个话题上非常清楚地表达了一种声音,而且大多数人已经开始远离 MD5。仍然使用 MD5 的情况是例外,而不是常态。

编辑(6/17):我看到您添加了一些提到使用 MD5 进行散列的链接。他们所证明的只是有些我从未听说过的人很困惑。所以呢?无论如何,你可能应该对那些在安全/密码学社区没有建立良好声誉的人的建议持怀疑态度。而且我不明白您如何批评安全/密码学社区,因为一些不在社区中的人感到困惑。究竟,我们应该做什么?我们已经尽我们所能来扩展有关正确方法的知识。我觉得你真的把责任归咎于错误的人。

无论如何,回答你关于为什么有些人仍然推荐 MD5 的问题:嗯,天哪,这可能是因为那些人​​不知道更好。我不知道关于这个主题还有什么可以说的,或者你希望任何人说什么。

我认为您所看到的是网络的长尾。我可以找到 2006 年推荐 MD5 进行密码散列的文章(例如http://www.pixel2life.com/publish/tutorials/118/understanding_md5_password_encryption/) - 在您的参考日期之后 10 年。

然而,我们正在谈论从同行评审的密码学期刊中的前沿研究中获得一些东西的时间,以向不阅读密码学期刊甚至不是该领域专家的日常从业者推荐实践。可能发生的事情是,因为在 1990 年每个人都“知道”MD5 对密码有用,所以他们告诉其他人 MD5 对密码有用。从 1990 年代后期开始,有人说 MD5 对密码不利,但大多数人“知道”它对密码有好处,他们仍然建议其他人这样做。

这些天来,有足够多的人“知道” bcrypt对密码有好处,你开始看到这些建议,但是说 MD5 对密码有好处的文章还没有从搜索引擎索引中消失. 随着时间的推移,他们会的。

这意味着十年后你会回到这里并问一个问题:“当这本杂志说你应该至少使用 150 时,为什么人们仍然建议使用 10的bcrypt工作因子?”......

Poul Henning-Kamp 最初将 UNIX crypt() 函数从 DES 移至 MD5。他在这里解释说,人们使用 MD5 的事实表明他没有成功地描述他试图做的事情:使密码散列更加复杂,而不是将 MD5 安装为 shibboleth。

你有 MD5 的几种用法

完整性检查

通过检查文件的哈希来检查您下载或接收的文件是否为原始文件。已经表明,您可以轻松创建具有相同校验和的文件。

MD5中的碰撞很容易产生MD5不应用于此目的。

人们在下载 iso 和其他东西时仍然建议使用 MD5 校验和,但通常也会给出 SHA 校验和。这可以解释,因为 MD5 快得多并且通常实现。

密码检查

不是以明文形式存储密码,而是存储密码的哈希值。一些网站仍然使用 MD5 来做到这一点。这里的问题不是要查找冲突,而是要检查彩虹表或 MD5 校验和的庞大数据库。

由于您可以非常快速地生成数百万个 MD5 校验和,因此您可以在自己的 PC 上暴力破解密码。出于这个原因,您不应该使用 MD5 对您的密码进行哈希处理,但大多数情况下,您应该添加一个 salt

如果您有一个非常复杂的密码(长有特殊字符)并且每个存储的密码都有一个唯一的复杂盐,那么使用 MD5 对您来说不是什么大问题。我不是说你应该(你不应该)但是如果密码很难被暴力破解并且使用彩虹表被盐阻止,那么使用 MD5 并不是一个巨大的安全问题。当然,在您的网站上,强制用户输入复杂的密码并不容易(并且值得赞赏),因此如果用户注册 12345,无论您使用什么哈希函数,它都会被破坏。

人们仍然使用它的原因可能是因为它仍然是最知名的哈希函数,并且在几年前仍然可以接受。没有太多加密知识的人可能会使用它。