安全地哈希密码 - 这么多冲突的建议!

Mat*_*tty 6 php passwords hash md5 salt

我正在阅读有关如何安全地存储密码的相互矛盾的建议.我所知道的不是使用MD5!我见过人们主张使用PHP的bcrypt功能,这看起来好像它会占用服务器的处理器.我见过盐的倡导者,并主张不使用盐.

这一切都是如此不清楚.关于如何安全地存储密码,是否有真实可信的建议?

编辑:经过大量研究后,我发现了一篇文章;登录:深入讨论该主题:http://www.usenix.org/publications/login/2004-06/pdfs/alexander.pdf

Jos*_*osh 6

嗯,这有几个部分.

  1. 您需要首先尝试使您的数据库和密码变得困难,并确保其安全.这包括不使密码明文而不使用对称加密算法.
  2. 你需要用盐.这样做可以防止人们使用预先计算的查找表(即彩虹表)或类似http://md5.rednoize.com/.为您的盐选择一些既独特不可预测的数据.我通常使用随机的32位值,但我不会少得多.
  3. 有些算法比其他算法强.这有两种方式定义
    1. 它的计算速度有多快.越长越好.攻击者可以越快地计算哈希值,暴力攻击的可能性就越大.
    2. 如果算法没有已知的弱点,这会减少搜索空间.例如,md5散列中的位数是误导性的,因为存在可以减少实际搜索空间的已知攻击

截至今天,我认为带盐的SHA1或SHA2在不久的将来是相当安全的.有一个名为bcrypt的实用程序,它使用不对称的河豚变种,并且内置了盐和计算费用的概念,可能值得一试.


编辑:我想澄清盐是什么,因为在SO和网上有很多误解.

什么盐不是

您使用密码哈希的秘密预先约定的字符串.这是一个秘密密钥,而不是盐.

什么是盐

您在散列时包含salt(每个散列的唯一且不可预测的)以及密码,但是您还在散列之外包含它的未加密副本,以便在稍后验证散列时,您可以在给定时包含相同的salt在散列之前测试密码,以便您可以正确地比较散列.