在所有这些关于md5漏洞的在线文章流传之后,我正在考虑切换到另一种哈希算法。据我所知,它一直是众多DBA中选择的算法。使用MD5代替(SHA1,SHA256,SHA384,SHA512)是否有很多好处,还是纯粹的性能问题?

您还建议使用其他哪种哈希(考虑到数据绑定)以应用程序为平台)?我当前使用的是盐腌哈希(MD5盐腌哈希)。请同时考虑md5文件哈希和密码哈希。

评论

您提到过盐腌哈希,这是否意味着您在谈论密码哈希?密码散列需要与普通散列不同的属性,这使得SHA-256在这种情况下几乎与MD5一样糟糕。

我正在使用md5哈希值来检查关键文件的完整性,然后再加载它们,并使用盐腌的md5哈希值作为密码。

都不是一个好选择,但是出于完全不同的原因。
像有多糟糕,我需要在重新编码整个部分之前完全了解情况,至少需要24小时才能完成。代码库就像2K

您可能想阅读如何安全地对密码进行哈希处理。我认为这是该网站上最重要的问题之一。

#1 楼

MD5用作密码

使用盐腌md5作为密码是个坏主意。不是因为MD5的密码学弱点,而是因为它速度很快。这意味着攻击者可以在单个GPU上每秒尝试数十亿个候选密码。

您应该使用故意缓慢的哈希构造,例如scrypt,bcrypt和PBKDF2。简单的盐腌SHA-2不够好,因为像大多数通用哈希一样,它很快。查看如何安全地对密码进行哈希处理?有关应使用的详细信息。

MD5用于文件完整性

使用MD5进行文件完整性可能会或可能不会是实际问题,具体取决于您的实际使用情况。

对MD5的攻击是碰撞攻击,而不是前映像攻击。这意味着,如果攻击者可以控制两个文件,则它们可以产生具有相同哈希值的两个文件。但是他无法匹配他没有影响的现有文件的哈希值。

我不知道攻击是否适用于您的应用程序,但是就您个人而言,即使您认为我也会开始迁移没有。忽略某些东西太容易了。安全胜过遗憾。

目前,这种情况下最好的解决方案是SHA-2(SHA-256)。一旦SHA-3标准化,这也是一个不错的选择。

评论


与在GPU上运行的ocl-hashcat相比,@ sarepta hashcat是无害的。单个GPU每秒可以实现超过60亿个组合。

– CodesInChaos
2012年9月8日19:23



从理论上讲,针对MD5进行预映像攻击是可能的,但是对于完整的预映像而言,当前攻击的计算复杂度为2 ^ 123.4。

– ewanm89
2012年9月8日23:05

请记住,使用MD5可能会发生部分映像前攻击。您可以获取现有文件并更改元数据/附加垃圾,并与完全生成的文件产生冲突。这就是MD5 SSL证书冲突攻击的工作方式。

–多项式
2012年9月10日下午6:03

@ ewanm89-2 ^ 123.4是不可行的(即使数十亿年,数十亿个GPU每秒计算数十亿个MD5哈希值)。是的,它比2 ^ 128好24倍,但是这种区别对于实际攻击没有意义。 (但是同意避免MD5的其他原因)。

– jimbob博士
2012年9月10日在6:24

@Polynomial我不会称其为部分原像。这有点像结构性碰撞。

– CodesInChaos
2012-09-10 9:41

#2 楼

为了完成@CodesInChaos的回答,经常使用MD5的原因是传统,而不是性能。处理数据库的人与处理安全性的人不同。他们通常认为使用弱算法没有问题(例如,看到MySQL用来哈希密码的算法笑话)。他们之所以使用MD5,是因为他们曾经使用过MD5,并且习惯于使用MD5。

性能讨论的次数多于测量的次数。但是,从逻辑上讲,如果没有什么可衡量的,则不会出现性能问题。使用基本CPU的一个内核,使用MD5可以每秒散列400 MB以上的字节,使用SHA-1可以散列300 MB / s的速度,而使用SHA-256则散列150 MB / s的速度。另一方面,像样的硬盘将以更低的速率(通常为100到120 MB / s)产生数据,因此哈希功能几乎不会成为瓶颈。因此,相对于数据库中的哈希,没有性能问题。

对于哈希函数的通常建议是:


不要这样做。您不应该使用基本的密码算法,而应使用能够组合几种算法的协议,以便它们共同提供某些安全功能(例如,具有机密性和完整性的数据传输)。
确实不要这样做。为了存储密码(更准确地说,是密码验证令牌),请勿自定义混合使用哈希函数和盐。使用经过专门研究的建筑。通常,这意味着使用bcrypt或PBKDF2。
如果确实使用哈希函数,则使用SHA-256。仅在已适当检测到并检测到SHA-256的一些严重问题(很可能是其性能)后,才考虑使用其他任何功能。


评论


我的回答是:“不要直接使用哈希函数-使用更大的系统,例如TLS进行数据传输,使用证书进行身份验证和/或使用bcrypt或PBKDF2进行密码存储。”

–乔西亚(Josiah Yoder)
19-10-16在14:05

#3 楼


我当前使用的是盐腌的哈希(MD5盐腌的哈希)。


如果您要盐腌MD5的哈希,则绝对不希望使用MD5。听起来您需要使用PBKDF2或bcrypt。


据我所知,它一直是众多DBA的首选算法。


>这不是一个令人信服的理由。

我已经与许多DBA进行了合作,这些DBA在通用技术方面至少落后了5年(不使用版本控制,未格式化的Perl脚本编写所有内容,等等)。他们可能是特别糟糕的DBA,但我认为它带有不改变事物的极其保守的心态。

#4 楼

只是为了补充已经给出的答案(其中大多数都是非常好的),我们现在有一个真实的例子,其中数据泄露(Ashley Madison)导致整个密码表被泄漏。他们使用带有随机盐的bcrypt来哈希密码。安全研究人员决定采用这些哈希并将其强行使用。这就是结果

作为所有这些的结果,bcrypt出于至少两个原因对试图破解Ashley Madison转储的任何人提出了苛刻的要求。首先,4,096个哈希迭代需要大量的计算能力。在Pierce的情况下,bcrypt将他的四GPU破解设备的速度限制在每秒微不足道的156次猜测中。其次,由于bcrypt哈希值是加盐的,因此他的设备必须一次猜测每个哈希值的明文,而不是全部一致。
“是的,没错,每秒156个哈希值,” Pierce写道。 “对于一个习惯于破解MD5密码的人来说,这看起来很令人失望,但是它是bcrypt,所以我会尽我所能。”
皮尔斯(Pierce)突破4,000分后就放弃了。他估计,要在Pierce的有限池中使用RockYou密码运行所有六百万个哈希,将需要长达19,493年的时间。在Ashley Madison转储中总共有3600万个哈希密码后,完成这项工作将花费116,958年。

最后,他能够破解的唯一密码非常简单或常用密码(例如“ 123456”)。

评论


实际上,其中一些可以作为MD5散列使用(我不确定是从较旧的系统还是从其他系统获得)。那些都没问题。

–亚历山大·奥玛拉(Alexander O'Mara)
16年7月11日在19:41

#5 楼

是的,MD5是不安全的,SHA-1也是不安全的,如果摘要的大小有问题,我建议使用SHA-256。请记住,如果将其存储到BINARY列中,则将比存储到CHAR中占用更少的空间。只需确保正确完成即可。 MD5比SHA-256快2.3倍。有关更多基准,请访问http://www.cryptopp.com/benchmarks.html

评论


请勿使用标准哈希值存储密码。他们太快了。 PBKDF2 / bcrypt是必经之路。

–多项式
2012年9月10日下午6:05

#6 楼

简而言之,由于彩虹表,它现在是非常不安全的,彩虹表是MD5哈希及其匹配字符串的列表。所以基本上我会考虑其他替代方法,例如SHA1

评论


彩虹表几乎同样适用于所有无盐散列。迁移到SHA1或SHA2几乎没有任何作用。正确的密码散列方法是将salt与故意慢的密码散列功能(例如PBKDF2,bcrypt或scrypt)一起使用。即使使用快速的无盐散列哈希,运行新的GPU搜索通常也比使用彩虹表便宜。

– CodesInChaos
2013年6月20日15:15



#7 楼

你们都在谈论不安全,但是没有人直接回答这个问题。

我一直在使用MD5和Sha512,一旦我放了一点东西,它们都很容易破解。黑客专家,直到它们都像雷声一样击中我们!
阻止如上所述的“大规模攻击”的最简单有效的方法是设置登录尝试的限制,这意味着:

function checkbrute($user_id, $mysqli) {
 // Get timestamp of current time
   $now = time();
   // All login attempts are counted from the past 2 hours. 
   $valid_attempts = $now - (2 * 60 * 60); 

   if ($stmt = $mysqli->prepare("SELECT time FROM login_attempts WHERE user_id = ? AND time > '$valid_attempts'")) { 
  $stmt->bind_param('i', $user_id); 
  // Execute the prepared query.
  $stmt->execute();
  $stmt->store_result();
  // If there has been more than 5 failed logins
  if($stmt->num_rows > 5) {
     return true;
  } else {
     return false;
  }
}
}



你明白我的意思了吗?
黑客想要尝试的最大组合数量,每2小时限制为5次失败。您甚至可以在X次尝试后阻止该用户。

评论


您无需考虑用户数据库或通过某些漏洞(例如SQLi)整体检索到的用户记录被盗/不当丢弃的备份。您的答案与通过服务器应用程序入侵实时数据库有关,服务器应用程序被认为是唯一访问此类数据的应用程序,一次只能使用一个用户帐户,如果这是唯一的风险,则可以更优雅地解决该问题,并使用密码首先不需要哈希。不相信我吗询问LinkedIn(以及其他);)

– TildalWave
2013年6月20日8:18



1)我明确地写道,MD5和SHA-2作为密码散列并不安全。 2)正确使用SHA-512不会产生已知的攻击。这是加密哈希,而不是密码哈希。 3)您缺少密码哈希的要点。密码哈希的目的是在数据库泄漏时保护密码。在那种情况下,速率限制器根本无济于事。

– CodesInChaos
13年6月20日在8:28

FWIW以这种方式限制登录尝试,这使得执行拒绝服务非常容易

–埃里克·格兰奇
15年12月17日在11:19

@EricGrange:显然,您对每个IP或其他IP限制它们,而不是总计。

– Evi1M4chine
17年9月9日在5:01

@ Evi1M4chine在IPv6时代,攻击者可以轻松(廉价地)拥有数百万个不同的IPv6地址

–埃里克·格兰奇
17年9月28日在15:56