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不一样状况下有不一样结果:加密
BCrypt牺牲性能来获得安全。它计算出hash比hash+salt要慢10000倍,所以增长了10000倍的破解成本。翻译
对于BCrypt,若是salt被泄露,一个简单的密码破解成本也须要几天。若是使用简单密码,用BCrypt进行加密也是不安全的。但若是salt没有丢失,或者salt丢失可是密码很复杂,须要不少年才能达到黄色级别,而且不可能获得红色级别。
做为总结,用户不要使用过于简单的密码。
使用hash+salt加密的状况下,若是你的密码够复杂,不须要担忧你会变成红色级别。惟一的例外是,你是攻击者的暗恋对象、伤了攻击者心的好基友,那么你将成为攻击者的目标,他不惜耗费大量时间来破解你的密码。
使用Bcrypt加密的状况下,你老是安全的,除非你使用过于简单的密码。然而,因为Bcrypt性能的缘由,若是你须要使用Bcrypt,那么你须要购买更多的web服务器用来密码验证。若是你有2个验证服务器,如今,你须要购买20000个服务器!
固然你能够配置BCrypt,使其更快,可是安全性将会降低。或者,你能够缓存明文密码,并在内存中计算出的哈希值,但若是内存转储泄漏,全部的明文密码将被泄露。
综上所述,若是你采用如下建议,建议使用hash+salt进行加密:
单独存放hash和salt。
强制用户使用强密码。
设计本身的哈希函数。不要简单地复制粘贴常见开源代码。