首先,我应该说我对编程比较陌生,所以如果这是一个幼稚或愚蠢的问题,请对我温柔一点。
好的,所以我正在编写一个小应用程序,其中一部分将涉及散列用户密码。在研究了执行此操作的最佳方法之后,md5 作为建议出现,几乎与批评其使用的文章中出现的次数一样多。
替代品是 SHA-1 等,它们更强大且不太可能被破解。这很有意义。
言归正传:
- 为什么 md5 仍然广泛用于散列
- 我应该自动为哈希密码打折 md5,还是在特定用例中它的使用实际上比其他哈希机制更好?
MD5 和 SHA-1 都不能用于散列密码。它们旨在快速计算,这正是您不想要的。如果人们使用这些散列算法来散列密码,很可能是因为他们不知道替代方案。
相反,您应该使用专门为此目的设计的bcrypt之类的东西。它可以配置为您需要的难以计算。随着计算机变得更快,您可以在计算中添加更多轮次以使其花费更长的时间。这将减慢获取哈希值并尝试使用暴力破解或基于字典的攻击来获取密码的攻击者。
有关的
出于同样的原因mysql_*
,使用函数,网络上的大多数资源和教程都已过时,导致新手程序员盲目使用它们(因为教程是这样说的!)。
我不怪新程序员,我怪教程制作者没有更新他们的教程。谷歌的搜索算法通常也会考虑年龄,并在搜索结果中显示较旧的条目。
至于替代方案,我相信马克拜尔斯说得比我好。
为什么 md5 仍然广泛用于散列?
它不是。甚至 Wordpress 几年前也放弃了它。并且 Wordpress 被广泛使用。
我应该自动打折它,还是在特定的用例中它的使用实际上比其他散列机制更好?
我不知道你的意思。使用适合密码散列的散列算法,您不必太担心。
在大多数情况下,MD5 仍然可以安全使用 [*],只要您在加密之前使用良好的“盐”与实际密码混合即可。
除了暴力破解之外,还没有其他已知的方法来完成对 MD5 的“第一次预映像攻击”,即给定一个哈希值,找出原始密码是什么。
上面提到的“盐”对于确保您的加密密码不能在“彩虹表”或其他现有的“要消化的字符串”列表中轻松查找是必要的。
最近的链接密码泄露就是一个很好的例子,说明为什么盐很重要。他们未能对用户的密码进行加盐,因此许多密码都被简单地反转了,因为这些密码的哈希值已经被计算过(并且在许多情况下是通过谷歌找到的)。
你仍然不应该做的是让盐本身很容易确定。如果攻击者可以算出盐是什么,那么所有的赌注都没有了,因为这样弗洛里安发布的文章中描述的蛮力机制就会再次可用。一个好的盐应该是长的,你不应该为每个用户使用相同的盐。
迄今为止,在 MD5 本身中发现的唯一真正的弱点是生成一个新文件的方法,当您已经知道原始文件的内容时,该文件设法产生与另一个文件相同的 MD5 摘要。这被称为“第二次原像攻击”,在考虑使用散列算法进行密码加密时无关紧要。
综上所述,如果有更好的算法(SHA-2、bcrypt)可用,您不妨使用它!
[*] 不过,我不会将 MD5 用于与电子商务相关的任何事情!
为什么 md5 仍然广泛用于散列
如果你想检查一个程序的有效性(md5 你的 ISO),这很好。有些人将它用于(不再)不应该用于的东西不应该是你关心的问题,而且是无法回答的:)
我应该自动打折它,还是在特定的用例中它的使用实际上比其他散列机制更好?
是的。如果您将其用于密码,请打折。你已经发现了弱点,但是看看@markbyers 是怎么说你应该使用的,例如 bcrypt