小编dav*_*idg的帖子

Web应用程序 - 存储密码

我错过了什么吗?是否有任何其他步骤存储数据库的密码?

存储密码:
    经过尽可能多的研究,我得出的结论是,在Web应用程序数据库(在我的例子中是MySQL + PHP)中存储用户密码的最佳方法如下:

  • 分配全站点静态盐.(16兰特字符包括0-9,az,AZ,[]/* - ')
  • 为每个用户分配随机盐(存储在数据库中).
  • 存储结果hash_function($ userPassword + $ sitewideSalt + $ randomSalt)
  • 将$ randomSalt存储在生成的哈希旁边.
  • 使用bcrypt可调工作负载散列

  • 攻击#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已经为每个哈希生成随机盐并将其存储在结果哈希中.

  1. http://www.grc.com/haystack.htm
  2. http://www.wildcardsecurity.com/security101/index.php?title=Local_File_Inclusion

security passwords hash salt

9
推荐指数
1
解决办法
3504
查看次数

标签 统计

hash ×1

passwords ×1

salt ×1

security ×1