即使在1996年就证明了这种方法的不安全性,仍然仍然建议使用这种方法来散列密码:


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


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

即使在进行了这项研究以及所有有关此缺陷的即将发表的论文之后,从那时起,它也一直被建议用作Web应用程序中的密码哈希函数。

甚至在某些证书颁发机构数字签名中使用(根据http://rmhrisk.wpengine.com/?p=60)

这是什么原因,为什么此消息摘要算法出于安全目的还不是被禁止吗?


链接,花了我几分钟的时间找到那些


http://www.stottmeister .com / blog / 2009/04/14 / how-to-crack-md5-passwords /
http://viralpatel.net/blogs/java-md5-hashing-salting-password/
http ://docs.joomla.org/How_do_you_recover_your_admin_password%3F
http://wordpress.org/extend/plugins/md5-password-hashhes/
http://doc.nette.org/en/security
http://www.justskins.com/forums/so-how-secure-is-98335.html


评论

从我的角度来看,这个问题听起来真像是一个咆哮。您可以将其重新表述为事实问题吗?请确保记录所有前提/假设。

@Ramhound如果您使用谷歌,例如。关于保护PHP Web应用程序的入门指南,80-95%的人将使用MD5,而不会发出这种方式不安全的通知。

@MarekSebera-我不使用随机来源来学习如何编写良好的安全代码。我使用已知使用好的编程概念的资源。我搜索了有关保护PHP Web应用程序安全的入门指南,第一篇文章并没有建议MD5。

@Ramhound引用的文字没有提及密码。 MD5中没有已知的漏洞可以阻止将其用于密码哈希。

#1 楼

为了补充@DW的好答案:对于密码哈希,MD5的破坏程度不比任何其他哈希函数(但仍不要使用它)。


完整图片:MD5是一个加密哈希函数,因此有望实现三个特征:




对原像的抵抗力:给定x,找到m使得MD5( m)= x
耐碰撞:不可能找到彼此不同的m和m',以至于MD5(m)= MD5(m')。

MD5被彻底破坏关于碰撞,但不适用于原像或第二原像。而且,1996年的攻击(多伯伯汀的攻击)根本没有破坏MD5。这是“压缩功能上的冲突”,即对MD5内部元素之一的攻击,而不是对完整功能的攻击。密码学家将其作为警告标志,这是正确的,因为2004年(由Wang出版)的实际碰撞攻击是根据Dobbertin的发现而建立的。但是MD5仅在2004年而不是1996年才被破坏,这是一次碰撞攻击。

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

但是无论如何都不要使用MD5。并非由于任何加密弱点,而是因为MD5不含盐且非常快。这正是您在密码哈希函数中不需要的。那些“建议使用MD5”作为密码哈希的人对此一无所知,这证明了一个真理,您应该始终牢记:并非您在Internet上找到的所有信息都是正确且值得信赖的。更好的密码哈希解决方案是众所周知的,并且已经使用和部署了十多年。有关详细信息和指针,请参见此答案。

评论


单独使用MD5散列密码不是一个好主意,因为它要求用户选择非常强的密码才能安全。但是,确实存在使用MD5计算加盐密码哈希的标准构造,据我所知,这还没有破坏。

–卡巴斯德
15年5月10日在8:57

您关于MD5的正确陈述过于快速且无盐(因为SHA家族也是如此),我仍会出于非技术原因而远离MD5:公共关系。必须说服您的老板或客户您所解释的内容真是太麻烦了。还有很多技术专家(他们的观点受到您试图说服的同一个人的重视)。毕竟,互联网上有很多“证据”支持他们坚信不应使用MD5,因为它在2004年就被破坏了。

– mgr326639
2015年12月17日在17:40



关于对原像的抵抗,我想知道为什么你没有提到佐佐木友;青木一郎(2009年4月16日)。 “以比穷举搜索更快的速度在完整MD5中查找原像”。 Springer Berlin Heidelberg和/或Ming Ming和Shaohui Chen和Xu Jin(2009)。 “用于MD5的原像攻击的初始结构的构建”。国际计算智能与安全会议。 IEEE计算机协会指出,2009年MD5的原像电阻(理论上)有所突破。

– e-sushi
17年7月26日在14:10



@ e-sushi好吧,这就是我的意思,“在理论上有所削弱”。

–托马斯·波宁(Thomas Pornin)
17年7月26日在17:17

@ThomasPornin在这种情况下,只需忽略我的评论,并将其视为确认您的陈述的有力补充。 ;)

– e-sushi
17年7月26日在20:30



#2 楼

你是什​​么意思“被禁止”?谁会“禁止”使用MD5?并不是说我们有一些国际加密警察会逮捕使用ROT13和其他不安全加密方案的人。或者,更严重的是:密码学家已经建议新系统应避免使用MD5,并且他们建议现有系统应从MD5迁移过来。我不知道您认为密码学家还可以做些什么。

您声称MD5是“通常推荐的散列密码的方式”,但是您没有提供任何证据。我认为该说法不正确。这不是我的经验。

最重要的是,密码学界已经很清楚地就这个话题发表了自己的看法,而且大多数人已经离开了MD5。仍然使用MD5的情况是一个例外,不是常规。

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

无论如何,要回答您有关为何有些人仍然推荐MD5的问题:恩,亲爱的,可能是因为这些人不知道更好。我不知道还有谁能对这个话题说些什么,或者您希望别人能说些什么。

评论


“禁止”一词可能用得不好。我的意思是更像是在其周围放置一个大警告屏幕,并将开发人员指向SHA或Blowfish,因为它可以达到相同的目的。是的,它已经越来越不习惯了,但是我们仍然可以在MD5上找到很多文章,其中不拒绝密码哈希中使用的文章。我在问题底部添加了一些链接,以证明我的主张是将MD5称为安全哈希算法。

– Marek Sebera
2012年6月17日19:28

@MarekSebera在密码哈希的上下文中,没有已知的针对md5的攻击不适用于Sha1 / 2。河豚甚至都不是哈希函数。

– CodesInChaos
2012年6月17日在21:29



@MarekSebera我的观点是,在密码哈希中,冲突攻击是完全不相关的。只要允许仍然很难找到第一个原图像,甚至允许与笔和纸发生冲突的哈希函数都可以完全安全地用于密码哈希。

– CodesInChaos
2012年6月18日在8:51

@curious由于存在冲突漏洞,攻击者需要控制两个字符串。谁在乎攻击者是否可以创建一个他知道两个不同密码的帐户,无论如何还是他的帐户。正确使用加盐(HMAC或密码前缀)会阻止正常的冲突攻击,因此您甚至无法找到与PBKDF2-HMAC-MD5发生的冲突。

– CodesInChaos
13年2月22日在9:38



我想他之所以说MD5被“普遍推荐”是因为网络上有太多真正的老教程,而且十年甚至更长时间都没有更新。问题在于,由于它们存在了很长时间,因此它们在搜索中的出现率通常很高,因此它们获得的流量远远超过了应有的流量。 StackOverflow不断地从参考古代教程的人们那里获得幼稚的问题。

– Spudley
13年3月3日在19:02

#3 楼

我认为您所看到的是网络的长尾巴。我可以找到2006年以来推荐使用MD5进行密码哈希处理的文章(例如,http://www.pixel2life.com/publish/tutorials/118/understanding_md5_password_encryption/)-距参考日期还晚了10年。

我们正在谈论的时候是时候从同行评审的密码学期刊的前沿研究中获得一些东西,以推荐那些不阅读密码学期刊甚至不是该领域专家的日常从业人员进行练习。可能发生的情况是因为在1990年,每个人都“知道” MD5可以用作密码,所以他们告诉其他人MD5可以用作密码。从1990年代后期开始,有人说MD5对密码有害,但是大多数人“知道”对密码有利,而这仍然是他们建议其他人使用的方式。足够多的人“知道” bcrypt适用于密码,您已经开始看到这些建议,但是有关MD5适用于密码的文章尚未从搜索引擎索引中消失。随着时间的流逝,他们会。使用至少150个?” ...

Poul Henning-Kamp最初将​​UNIX crypt()函数从DES移到了MD5。他在这里解释说,人们正在使用MD5的事实表明,他没有成功描述自己的意图:使密码哈希变得更加复杂,而不是将MD5安装为shibboleth。

评论


我同意,很长一段时间以来,许多开发人员改变了想法,这长期以来都依赖MD5。并且感谢您提到bcrypt,因为它是可以进行硬件扩展的优良算法,我也建议您这样做。也许会很好,看到Google为此推荐了MD5的黑名单文章:D

– Marek Sebera
2012年6月17日19:35

@MarekSebera我不确定我是否希望看到搜索引擎审查任何内容。

–user185
2012年6月18日在8:52

是的,即使我敢打赌,这还不是一个认真的主意。

– Marek Sebera
2012年6月18日在9:26

#4 楼

MD5的几种用法

完整性检查

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

MD5中的冲突很容易产生。 MD5不应用于此目的。

人们在下载iso和东东时仍会建议MD5校验和,但通常还会提供SHA校验和。之所以可以这样解释,是因为MD5速度更快并且通常可以实现。一些网站仍然使用MD5来做到这一点。这里的问题不是找到冲突,而是检查彩虹表或庞大的MD5校验和数据库。

由于可以快速生成数百万个MD5校验和,因此您可以在自己的密码上强行使用密码自己的电脑。出于这个原因,您不应该使用MD5来对密码进行哈希处理,但是大多数情况下,您应该添加盐。密码,那么使用MD5并不是什么大问题。我不是说您应该(您不应该),但是如果密码很难被暴力破解,并且由于食盐而阻止使用Rainbow表,那么使用MD5并不是一个巨大的安全问题。当然,在您的网站上,强迫用户输入复杂的密码并不容易(并且不被接受),因此,如果用户注册12345,无论您使用哪种哈希函数,都会被破坏。

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

评论


“如果您有一个非常复杂的密码(带有特殊字符的长字母)”,那么是否“每个存储的密码都有一个唯一的复杂盐”也没关系,

–好奇
2012年6月8日在11:34

除非将MD5与安全算法配对使用,否则不应将其用于密码检查。 MD5的主要问题是输出长度短。

–猎犬
2012年6月8日15:57

@Ramhound请定义“安全算法”。 “ MD5的主要问题是输出的长度短。”拥抱?

–好奇
2012年6月9日7:10

@curiousguy是的,盐很重要,因为它阻止创建可用于任何密码的彩虹表。在这里,您需要为每个密码(和盐)建立一个表。

–马丁·特里高(Martin Trigaux)
2012年6月9日12:27



我不知道为什么这个答案被否决了。它具有良好而有用的信息。关于完整性检查和密码检查之间的区别的观点是完全正确的;这两个应用程序具有不同的安全性要求。附言答案有一个待改进之处,就是建议使用盐还不够。您还应该建议使用慢速哈希函数,例如scrypt,bcrypt或PBKDF2。

– D.W.
2012年6月14日18:14

#5 楼

我不建议您这样做。 Wikipedia指出MD5被认为是损坏的,建议使用SHA-2或SHA系列代替它。还可以看看Devise,这是处理授权的红宝石。它具有不同类型的加密器。

评论


而且我认为,在使用红宝石的建议下,磨砂膏就在其中。正在实现MD5的“人们”之所以这样做,并不是因为他们故意尝试使用损坏的哈希函数,而是因为他们正在使用尚未更新为使用更安全方法的gem,模块,软件等。他们没有更好的知识,而且显然他们不在乎。

–logicalscope
2012年6月7日19:21



好吧,如果有帮助,php.net本身建议不要将其用于密码“由于这种哈希算法的快速特性,因此不建议使用此功能来保护密码。” -php.net/manual/en/function.md5 .php

–特拉维斯·佩塞托(Travis Pessetto)
2012年6月7日19:31

@curiousguy MD5已损坏,因为它可以通过蛮力轻易破解。如果掌握了哈希值,几乎可以知道短时间内的密码。不确定确切的时间,但是我相信只有几分钟的时间。只需尝试所有操作,直到散列相同,即可完成此操作,并且由于MD5算法速度很快,因此可以轻松快速地做到这一点。

–特拉维斯·佩塞托(Travis Pessetto)
2012年6月13日14:03

@curiousguy来自PHP.net“诸如MD5,SHA1和SHA256之类的哈希算法被设计为非常快速和高效。借助现代技术和计算机设备,按顺序“强力”使用这些算法的输出已变得微不足道由于现代计算机可以“逆向”这些哈希算法的速度很快,因此许多安全专业人员强烈建议不要将其用于密码哈希。

–特拉维斯·佩塞托(Travis Pessetto)
2012年6月13日17:13



@curiousguy,我不认为这是胡扯。这是完全标准的建议。标准建议是使用慢速哈希(例如bcrypt,scrypt或PBKDF2),而不是快速哈希(例如MD5,SHA1或SHA256),如果需要哈希密码。 (当提到“蛮力”时,它们可能是指枚举通用密码的字典攻击。这些攻击非常有效,因为许多人选择了熵不是很高的密码。)在此站点上搜索“密码”以学到更多。

– D.W.
2012年6月14日18:12

#6 楼


即使经过了这项研究,以及所有有关该缺陷的后续论文,从那以后,它就一直被推荐为Web应用程序中的密码哈希功能。 />
密码散列只是浪费时间。

MD5 ^ n(MD5迭代了n次)与SHA1 ^ m(对于m,例如time(MD5^n) >= time(SHA1^m))一样好。

没有人提出过比明显的MD5 o MD5^(n-1)更快的MD5 ^ n计算方法。甚至还没有一个想法开始。

评论


“ MD5 ^ n(MD5迭代n次)与SHA1 ^ m一样好”-这是100000000%否您可以对字符串执行MD5无限次,并且输出是已知的。 MD5是不安全的,不应仅用于散列密码。 SHA256是安全的,而MD5不是。

–猎犬
2012年6月8日15:59

@ Ramhound,100000000%错误-是否将mod 100环绕,所以它是0%错误?更严重的是,你错了,好奇心是对的。您的陈述无济于事,似乎反映出对情况的误解。 “ X是安全的”不是有帮助的说法;您必须指定“对什么安全?”。如果这样做,您会发现curiousguy的答案非常准确。众所周知,对MD5的冲突攻击是冲突攻击,它们不会危害使用MD5哈希密码。

– D.W.
2012年6月14日18:16



看到有很多人否决了这个答案,我感到很失望。听起来,对于密码哈希函数的安全要求存在广泛的误解或困惑。实际上,好奇心的答案是完全准确的。 @MarekSebera和Ramhound的评论不准确,并且对密码哈希的安全要求有些困惑。

– D.W.
2012年6月14日18:20



我不会使用“同样好”一词,因为我认为对md5进行映像前攻击的加密分析比对SHA-1进行加密的可能性更大。但是到目前为止,这是正确的,当前的攻击无法找到比简单猜测密码更快的MD5第一映像。

– CodesInChaos
2012年6月17日在21:38

@CodeInChaos“我认为对md5进行图像前攻击的密码分析比对SHA-1进行密码分析的可能性更大”,是的,但我认为这种攻击变得便宜或比运行整个字典便宜的可能性很小(+琐碎的上限或加位数字等变体)通过MD5。 OTOH,这样的攻击可能使猜测高熵密钥K更容易,而已知MD5(K)则比通过强行强制密钥空间来猜测。

–好奇
2012年6月17日在22:41

#7 楼

这是有关MD5的官方信息-容易受到碰撞攻击的MD5
为了提高安全性,应考虑使用SHA-2。没有人会阻止用户使用MD5,但不会阻止用户使用要保密的数据。

哈希算法的性能

如图“哈希算法的性能”所示,SHA256比MD5快得多。

这是一个值得考虑的资源,作者调查了LinkedIn泄漏的密码-queue(。)acm(。)org / detail.cfm?id = 2254400&ref = fullrss ,还显示了一些如何保护密码的方法。

#8 楼

密码哈希和使用Rainbow表的问题归结为通过潜在漏洞利用Web服务器的安全性。您的密码是安全的。。。嗯,让我们将这些网站视为网上诱骗,所有聚集在这些网站上的人正在喂彩虹桌子。这是问题的一部分。

其次是使用Web托管服务的人,他们的目标是赚钱而忘了Web服务器的安全性,这些主机应放在墙边,恕我直言,用户登录安全性的一部分来自Web服务器的安全性以及最新的基础技术,以阻止已知漏洞的使用。

第三点是,一旦人们获得令他们大吃一惊的是,尽管MD5不能抗冲突,或者我希望它尽可能地健壮,但是除非您拥有运行可利用系统的Web主机,否则仍然很难对用户帐户进行黑客攻击。并且您可以通过声称拥有密码安全性的网站来暴露自己。

对于MD5来说,盐+值足以确保用户在Web论坛上登录的安全性,只要使用上述系统并且软件不可利用。一旦您的系统被漏洞利用,运行查询不使用盐腌系统的已知哈希值将暴露第四个漏洞……最终用户。

第四位是最终用户,您的网络安全最终仅取决于最弱的链接,对于许多人来说,他们将看到最终用户的正是这样,管理员需要记住他们是系统的最终用户,并且同样容易受到攻击通过使用容易破解的草率编程或软件,较差的密码安全性以及还无法更改ADMIN登录名或使用当今仍坚持将admin登录名设为Admin并使用超级用户帐户的软件,损害了系统安全性。

因此不用多说,所以我还是要说MD5不会被破解,它是通过弱用户,弱软件和人们无法理解技术进行反向工程的。如果MD5破解了,SHA和AES等也破解了...