【问题标题】:Why is md5 still widely used为什么md5仍然被广泛使用
【发布时间】:2012-06-23 10:00:33
【问题描述】:

首先,我应该说我对编程比较陌生,所以如果这是一个幼稚或愚蠢的问题,请温柔对待我。

好的,所以我正在编写一个小应用程序,其中一部分将涉及对用户密码进行哈希处理。在研究了执行此操作的最佳方法后,md5 作为建议出现,几乎与批评其使用的文章中出现的次数一样多。

替代方案是 SHA-1 等,它们更强大且不太可能被破解。这很有意义。

言归正传:

  1. 为什么 md5 仍然广泛用于散列
  2. 我应该自动对 md5 进行哈希密码打折,还是在某些特定用例中它的使用实际上比其他哈希机制更好?

【问题讨论】:

标签: php md5 security hash


【解决方案1】:

MD5 和 SHA-1 都不应该用于散列密码。它们旨在快速计算,这正是您不想要的。如果人们使用这些散列算法对密码进行散列,很可能是因为他们不知道替代方案。

相反,您应该使用专门为此目的设计的 bcrypt 之类的东西。它可以配置为您需要的难以计算。随着计算机变得更快,您可以在计算中添加更多轮次以使其花费更长的时间。这将减慢获取哈希值并尝试使用暴力破解或基于字典的攻击来获取密码的攻击者。

相关

【讨论】:

  • 谢谢马克。答案似乎是 bcrypt 是更好的解决方案。我将对此进行调查。您知道在大流量网站上是否会出现性能问题,将其用作其用户的身份验证方法?
  • @JohnMoore:无论您使用哪种身份验证方法,大流量网站都可能出现性能问题。身份验证通常只占服务器总负载的一小部分。
  • 这不是一个完整的答案。如果它像您所说的那样简单,为什么像 wordpress 和 joomla 这样广泛使用的应用程序会直接使用 md5 哈希作为用户密码?我不知道答案,但很好奇!
  • @giorgio:Wordpress 允许管理员配置它使用的散列方案。它在其实现中使用phpass(因为大约是5 years ago)。来自 phpass 文档:“phpass 支持的首选(最安全)散列方法是 OpenBSD 风格的基于 Blowfish 的 bcrypt”。但是我怀疑很少有人会真正费心去阅读文档。
  • 更重要的是,始终检查更好的更新。目前 argon2 似乎是更好的密码算法,请参阅security.stackexchange.com/questions/193351/…
【解决方案2】:

出于同样的原因使用mysql_*函数,网络上的大部分资源和教程信息都已经过时,导致新手程序员盲目使用(因为教程是这么说的!)。

我不怪新程序员,我怪教程制作者没有更新他们的教程。 Google 的搜索算法通常也会考虑年龄,并在搜索结果中显示较旧的条目。

至于替代方案,我相信 Mark Byers 说得比我好。

【讨论】:

    【解决方案3】:

    为什么 md5 仍然广泛用于散列

    这很好,如果你想,例如检查程序的有效性(md5 你的 ISO)。有些人将它用于(不再)不应该用于的东西不应该是你关心的问题,而且是无法回答的:)

    我应该自动对其进行折扣,还是在某些特定用例中它的使用实际上比其他散列机制更好?

    是的。如果您将其用于密码,请打折。您已经发现了弱点,但请查看@markbyers 对您应该使用什么的看法,例如加密

    【讨论】:

    • 实际上,为了验证攻击者也可以访问原始 ISO 的大块数据(即 ISO),MD5 不是一个好的选择。这正是已知的对 MD5 的第二次前映像攻击的正确条件,并且允许攻击者在 ISO 中包含其他内容,但仍然对其进行验证。
    • 当然,检查来自未知来源的 ISO 需要更高的安全性。另一方面,如果我的网站上有程序,我会添加一个 MD5 以避免下载问题。如果攻击者更改了我的 ISO,他们肯定也可以更改同一个站点上提到的 MD5 哈希,那么为什么还要麻烦呢?无论如何,这只是给出人们使用它的原因之一的一个例子,因为这就是问题所在。从来没有说过它没有任何问题......
    • 这不是重点 - MD5 哈希通常通过不同的渠道单独发布,因此黑客通常无法同时更改文件 和 已发布的摘要。我试图说明的一点是,MD5 仍然(在纯密码分析方面)和以往一样好用于密码,但 不是 用于文件验证。唯一改变w.r.t的东西。密码验证是摩尔定律现在使每秒暴力测试数百万个密码成为可能。
    【解决方案4】:

    为什么 md5 仍然广泛用于散列?

    事实并非如此。甚至 Wordpress 几年前也放弃了它。并且 Wordpress 被广泛使用。

    我应该自动对它进行折扣,还是在某些特定用例中它的使用实际上比其他散列机制更好?

    我不明白你的意思。使用适合密码散列的散列算法,您不必太担心。

    【讨论】:

      【解决方案5】:

      在大多数情况下[*] 使用 MD5 仍然相当安全,只要您在加密之前使用良好的“盐”与实际密码混合即可。

      除了暴力破解之外,还没有其他已知的方法来完成对 MD5 的“第一次预映像攻击”,即给定一个哈希值,找出原始密码是什么。

      上面提到的“salt”对于确保您的加密密码不能在“彩虹表”或其他现有的“要消化的字符串”列表中轻松查找是必要的。

      最近的链接密码泄露就是一个很好的例子,说明了为什么盐很重要。他们未能对用户密码进行加盐,因此许多密码都被简单地反转了,因为这些密码的哈希值已经计算过了(在许多情况下是通过 Google 找到的)。

      你仍然不应该做的是让盐本身很容易确定。如果攻击者可以算出盐是什么,那么所有的赌注都没有了,因为那时 Florian 发布的文章中描述的蛮力机制再次可用。一个好的盐应该是长的,你不应该为每个用户使用相同的盐。

      目前在 MD5 本身中发现的唯一真正弱点是生成一个新文件的方法,当您已经知道原始文件的内容。这被称为“第二次原像攻击”,在考虑使用散列算法进行密码加密时无关紧要。

      话虽如此,如果有更好的算法(SHA-2、bcrypt)可用,你不妨使用它!

      [*] 不过,我不会将 MD5 用于与电子商务相关的任何事情!

      【讨论】:

      • MD5 对于任何与安全相关的事情都不再安全了。尤其不是密码。即使在 MD5 中没有发现任何缺陷,它仍然不适用于密码,因为它太快了。 Salt would not have saved LinkedIn。如今,暴力破解 MD5(或 SHA1)密码比从磁盘上读取彩虹表更快。 LinkedIn 的哈希值在被泄露之前已经被重复数据删除,如果使用了 salt,这是不可能发生的。 SHA2 系列太快了。使用 bcrypt、scrypt 或 PBKDF2。
      • @Ladadadada 当然,使用 bcrypt、scrypt 等等,我同意所有这些都是最佳做法。但事实仍然是,使用适当的随机盐(比如 256 位),其中每个密码都有不同的盐并且黑客不知道它仍然需要比宇宙的生命周期更长的时间来暴力破解 MD5即使是曾经制作的每一张 NVidia 卡。以每秒 1 次尝试强制密码登录比暴力破解哈希要快得多。您链接的答案中的大多数 cmets 似乎都同意这一点。
      • 检查 MD5 的整个键空间,当然,比宇宙的生命周期更长。检查整个可打印 ASCII 设置为 MD5 的 8 个字符?单台 Radeon HD 5830 35 天,售价 170 美元using this table。平均而言,找到密码的时间可能只有一半。 Salt 不会改变检查单个密码所花费的时间(除非它足够大以至于磁盘访问成为瓶颈)。它只强制每个密码单独破解。请解释一下每秒 1 次尝试如何比每秒 33 亿次更快?
      • @Ladadadada 你已经忽略了我建议的 256 位 extra 熵的全部内容 - 这足以每秒进行 33 亿次检查,数十个数量级太慢了。 Unknown salt 确实会增加检查密码的时间 - 您所说的仅适用于您知道 salt 是什么的情况。暴力破解登录屏幕比暴力破解哈希更快,因为根据定义,您不需要猜测盐 - 登录屏幕会为您完成。
      • Unknown hashes 会是一个更好的选择。为什么不把它们保密而不是盐呢?无论您将盐存储在何处,都需要它和哈希来登录用户,因此它们都必须易于访问。你必须假设如果攻击者可以得到你的哈希值,他就能得到你的盐。如果你能阻止他拿你的盐,你可以对哈希做同样的事情。您所描述的本质上是加密密码,而不是散列密码并调用您的密钥salt。现在您的问题是密钥管理。
      猜你喜欢
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 2011-06-15
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多