我错过了什么吗?是否有任何其他步骤存储数据库的密码?
存储密码:
经过尽可能多的研究,我得出的结论是,在Web应用程序数据库(在我的例子中是MySQL + PHP)中存储用户密码的最佳方法如下:
攻击#1: 攻击者通过SQL注入转储数据库.
我们的hash_function的DB结果和每用户盐的随机数.
转储后,攻击者可以通过查找自己的帐户获取$ userPassword和 $ randomSalt.然后通过猜测md5等哈希函数,他可以在$ sitewideSalt上开始彩虹攻击 .但这可能需要1.41亿个世纪[1].
通过使用此类安全性,不允许转储数据库来破坏存储的密码.用户仍然必须通过另一种方法找到$ sitewideSalt.
攻击#2: 攻击者找到本地文件包含(LFI)向量.
攻击者可以获取我们的Web应用程序的原始代码.
在通过可能的LFI或RFI [2]利用Web应用程序之后,攻击者读取我们的Web应用程序的源代码并获得我们的简单算法和存储的
$ sitewideSalt.
下一步去哪儿?
现在,攻击者拥有他可以开始彩虹的两种盐来获取实际的密码.除非他必须为每个用户制作1个彩虹表,因为每个用户都有不同的随机用户特定盐($ randomSalt).
"现代服务器可以计算每秒大约330MB的MD5哈希值.如果您的用户拥有小写,字母数字和6个字符长的密码,您可以在大约40秒内尝试每个可能的密码."
"...... CUDA,你可以将自己的小型超级计算机集群放在一起,让你每秒可以尝试大约700,000,000个密码......"[3]
我们现在需要做的是使用耗时的算法扩展散列函数,例如bcrypt.bcrypt的工作负载因子可以是更简单的散列函数的5-6个数量级.破解一个密码可能需要数年而不是几分钟.并且作为奖励,bcrypt已经为每个哈希生成随机盐并将其存储在结果哈希中.