今天有位教授告诉我们,MD5很弱。我理解他的思路,但指出,恕我直言,如果您使用长(甚至非常长)动态盐和静态胡椒,恕我直言 MD5 是一个不错的选择。
他盯着我说NO!
恕我直言,使用任何字典“暴力破解”md5 哈希的可能性甚至很简单。如果您使用动态/各种盐,它将很难获得复杂度为 O(2^n) 的匹配,如果我在我的加盐密码哈希之前和之后使用胡椒,它不会 100% 安全,但可能需要很长一段时间来计算它..
今天有位教授告诉我们,MD5很弱。我理解他的思路,但指出,恕我直言,如果您使用长(甚至非常长)动态盐和静态胡椒,恕我直言 MD5 是一个不错的选择。
他盯着我说NO!
恕我直言,使用任何字典“暴力破解”md5 哈希的可能性甚至很简单。如果您使用动态/各种盐,它将很难获得复杂度为 O(2^n) 的匹配,如果我在我的加盐密码哈希之前和之后使用胡椒,它不会 100% 安全,但可能需要很长一段时间来计算它..
MD5 中有许多已知的加密弱点使其无法用作消息摘要算法,但并非所有这些都适用于密码散列的上下文。但即使我们假设这些不存在,MD5 仍然是一种糟糕的密码散列算法,原因很简单:它太快了。
在攻击者获得散列密码的任何情况下,您都必须假设他们还获得了每个密码的盐和胡椒。
使用辣椒的唯一原因是您不能使用在攻击之前预先计算的彩虹表,因为您需要为每个数据库使用不同的彩虹表。使用盐的唯一原因是您不能对整个密码数据库使用相同的彩虹表,因为两个不同帐户的相同密码将具有不同的哈希值。
胡椒和盐的长度并不重要。它们的唯一目的是确保每个值都是唯一的。更长的长度并不会使攻击变得更加困难(有更多的数据要散列,但这最多是线性增加)。
底线是,只需要一个短盐就可以确保攻击者必须暴力破解所有可能的密码才能为每个帐户找到正确的哈希值。
这就是 MD5 的弱点发挥作用的地方:它是一种快速且节省内存的算法。这意味着攻击者可以每秒计算大量密码的哈希值。使用价值几千美元的专用硬件(如 FPGA 阵列或 ASIC),您可以在几个小时内计算出给定盐的所有可能的 8 字符密码的哈希值。
为了更好的安全性,请使用像 bcrypt 这样的慢速算法。这意味着您的系统需要更多的 CPU 周期来验证用户身份,但回报通常是值得的,因为如果攻击者获得密码数据库,他们还需要更多的处理能力来暴力破解您的密码数据库。
使用 MD5 的危险程度取决于您使用它的目的,但根本没有令人信服的理由来使用它。
绝对不能将 MD5 用于签名,因为在使用 MD5 时有可能(并且随着时间的推移变得越来越可能)绕过签名提供的保护。
另一方面,如果您的目的是白化随机数据以获得更一致的 1 和 0 分布,那么 MD5 与以往一样好。请注意,这不是安全敏感操作;没有攻击向量,因为没有目标,通过算法知识不会获得或失去任何东西,只是一个简单的转换,其中输出是真正随机的,因为输入是真正随机的。
在这两个极端之间的某个地方,您会发现所有其他操作。随着您正在做的事情的敏感性以及您对加密哈希的不可逆性的依赖增加,使用 MD5 的危险也增加了。
但是不使用 MD5 的最佳理由与不使用三重 DES 的最佳理由相同:有更好的选择可用,使用旧算法没有优势。MD5 已死;它在某些有限的情况下可能有用,但更好的选择是完全避免使用它,以免在安全性很重要的地方意外使用它。