php - 安全地散列密码 - 这么多相互矛盾的建议!

标签 php hash passwords md5 salt

关于如何安全地存储密码,我阅读了很多相互矛盾的建议。我所知道的就是不要使用 MD5!我看到人们提倡使用 PHP 的 bcrypt 函数,这似乎会占用服务器的处理器。我见过盐的提倡者和不使用盐的提倡者。

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

编辑:经过大量研究,我从 ;login: 找到了一篇文章,该文章相当深入地讨论了该主题:http://www.usenix.org/publications/login/2004-06/pdfs/alexander.pdf

最佳答案

好吧,这有几个部分。

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

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


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

什么是盐不是

一个 secret ,预先商定的字符串,你用密码散列。这是 key ,不是盐。

什么是盐

您在散列时将盐(每个散列唯一且不可预测)与您的密码一起包括在内,但您还在您的散列的外部包括了它的未加密副本,因此在稍后验证散列时,您可以在散列之前给定测试密码时包含相同的盐,这样您就可以正确地比较散列。

关于php - 安全地散列密码 - 这么多相互矛盾的建议!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6879706/

相关文章:

html - 为什么浏览器不要求记住密码?

PHP 简单 HTML Dom 内存问题

php - 基于存储的变量进行比较

java - Java中检查密码的方法不起作用

java - 为什么对于大多数基于散列的结构,除了像 ThreadLocal 之类的结构,Java 的语言设计者更喜欢链接而不是开放寻址?

validation - 如何检查提供的字符串是否是有效的 IPFS 或 IPNS 路径?

passwords - 去吧,基本的访问认证

php - 插入单选按钮的值

javascript - 日期选择器在表单重新加载后显示选定的值

c# - 如何在不将整个文件加载到内存的情况下读取/流式传输文件?