md5/sha1+salt and Bcrypt

PHP自带的MD5和SHA1加密函数是否安全,看了不少年前的一篇博文。原文为英文,我的英语能力真的有限,翻译了一下,其中一定存在不少错误,但愿各位能够指正。
原文连接web


中国最大的开发者社区网站CSDN被破解了,数据库泄露。在泄露的数据库中,密码是明文存储的。人们在微博上发表关于密码和安全相关的消息。我注意到一条消息,用MD5/SHA1+salt存储密码并不安全。该条微博的做者强烈建议使用BCrypt进行加密。虽然我不擅长的加密和安全技术,可是在个人记忆中,SHA1+salt是存储密码最流行的方式。怎么多是不安全的?数据库

我为密码安全定义了两个级别:黄色级别和红色级别。当数据库被泄露,若是经过计算获得一个能够经过认证的密码,这时安全级别为黄色;若是经过计算能够获得原始密码,这时安全级别为红色。缓存

红色级别的安全隐患比黄色级别严重不少。人们一般在不一样的站点使用相同的密码。若是原始密码被泄露,全部的站点都存在安全隐患。若是攻击者不能计算出原始密码,那么影响的仅仅是被攻击的站点。在个人印象中,人们须要防范红色级别的安全隐患。防止黄色级别并非硬性要求。安全

在个人印象中,hash+salt已经足够好了。为何我还要使用BCrypt?服务器

若是咱们分析定义的两个级别,咱们应该提出这样的问题:对于给定的经过计算获得的密码,如何判断它是不是原来的。常见的解决方案是使用数据字典或分析字面模式。当涉及到数据字典时,它将变得颇有趣。攻击者一般使用暴力破解和数据字典两种方式进行密码破解。从维基百科和BCrypt的介绍来看,hash+48bit salt很难被暴力破解。这须要半分钟来遍历全部的6个字符的密码。对于48位散列,须要花费几个月时间。函数

在这种状况下,攻击者一般选择放弃,除非目标用户是一个重要人物。当暴力破解失败,惟一的办法就是使用数据字典。若是密码不在数据字典中,那么你将无能为力。性能

以上的分析基于salt不被泄露的状况。若是salt被泄漏,我的用户失去保护。在这种状况下,攻击者只需进行逐一计算。攻击者不能使用rainbowmap。若是密码复杂程度为8位字符,须要超过70小时,遍历全部的可能性。网站

从上面的分析,使用hash+salt不一样状况下有不一样结果:加密

  1. 若是salt仍然是安全的,那么你是安全的,除非你是一个重要人物,否则不会成为目标。正常攻击者不为为难你。
  2. 若是salt被泄露,状况取决于你密码的复杂性。对于简单的密码,破解可能只须要几秒钟。对于8位字符的密码,好比315@hkBJ,达到黄色级别的安全隐患,攻击者只需花费几个小时,可是若是要达到红色级别,须要利用集群计算机计算几天。

BCrypt牺牲性能来获得安全。它计算出hash比hash+salt要慢10000倍,所以增长了10000倍的破解成本。翻译

对于BCrypt,若是salt被泄露,一个简单的密码破解成本也须要几天。若是使用简单密码,用BCrypt进行加密也是不安全的。但若是salt没有丢失,或者salt丢失可是密码很复杂,须要不少年才能达到黄色级别,而且不可能获得红色级别。

做为总结,用户不要使用过于简单的密码。

使用hash+salt加密的状况下,若是你的密码够复杂,不须要担忧你会变成红色级别。惟一的例外是,你是攻击者的暗恋对象、伤了攻击者心的好基友,那么你将成为攻击者的目标,他不惜耗费大量时间来破解你的密码。

使用Bcrypt加密的状况下,你老是安全的,除非你使用过于简单的密码。然而,因为Bcrypt性能的缘由,若是你须要使用Bcrypt,那么你须要购买更多的web服务器用来密码验证。若是你有2个验证服务器,如今,你须要购买20000个服务器!

固然你能够配置BCrypt,使其更快,可是安全性将会降低。或者,你能够缓存明文密码,并在内存中计算出的哈希值,但若是内存转储泄漏,全部的明文密码将被泄露。

综上所述,若是你采用如下建议,建议使用hash+salt进行加密:

  1. 单独存放hash和salt。

  2. 强制用户使用强密码。

  3. 设计本身的哈希函数。不要简单地复制粘贴常见开源代码。

相关文章
相关标签/搜索