盐和密码

可能重复:
为PHP密码提供安全散列和盐分

对于我的密码,我应该使用这样的盐(盐对每个用户都是唯一的,而不是直接用密码保存)...

$salt = sha1(md5("coders gonna code"));
$password = md5($salt.$password);

或者如果我只是使用它会好吗?

$password = md5($password);

因为如果我使用的盐,即使用户进行了错误的密码,例如密码都不会有问题,因为盐(在这种情况下)将145ac26ff093c6e1317f7d5fb4c9fd11c77be975所以对于有密码的条目将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975password它根据http://howsecureismypassword.net/它需要3个十亿年才能破解....所以意见? 或者我应该更糟糕,去

$password = md5($salt.$password.md5($salt));

如果这个人已经足够远以获得盐哈希,是否有什么能够阻止然后进一步? <最后一个密码的声明


对于每个用户都应该这样做的人...我知道,这仅仅是一个例子。


您应该更改盐以使其对每个用户都是特定的,而不是系统常量。 这会让彩虹表攻击你的密码更加不方便。

关于特洛伊亨特在这篇文章中盐析的演变有一个很好的写法。

编辑

$salt是每个密码记录唯一的东西,它为它增加了很多熵。 这通常是一个随机的字节序列,与用户帐户一起存储。

散列传统上是通过salt + password连接完成的。

$passwordHash = hash($salt.$password);

正如其他人所说的,不要使用MD5进行散列。 它被打破。

不建议在散列之前将其他专有算法应用于密码或盐。 相反,看看PBKDF2等行业优势解决方案,除了腌制之外,还需要许多(通常> 10k)重复迭代,这将进一步减慢攻击者的速度。

如果您采用OWASP指南,则应定期增加执行的哈希数(以抵消摩尔定律)。 散列的数量也应该保持为每个用户,这意味着您需要存储散列密码,salt和迭代次数的三倍。


你完全错误地使用盐。 盐应该是不可预测的; 你的盐是完全相反的(固定)。 由于固定散列绝对没有好处,因此它似乎也指望攻击者不知道盐。 这是通过默默无闻的安全定义,这是另一个不好的做法。

你应该做的是:

  • 使用合理长度的不可预知的字符串作为盐。 从池中随机生成8个字符的字符串,如小写字母和数字都可以。
  • 为每个用户使用不同的盐,并在每次更改密码时对其进行更改。
  • 从MD5(被认为中断)移动到另一个更适合此应用程序的散列函数。 SHA-1更好,因为它不会被破坏; bcrypt是最好的,因为它具有可配置的加载因子。

  • 不要使用MD5作为哈希算法,而应使用更安全的方法,如SHA256甚至bcrypt

  • 如果有人确实获得了进入数据库的密码,那么他们将无法为普通的哈希或使用诸如彩虹攻击等技术反转密码。

  • http://michaelwright.me/php-password-storage

    http://en.wikipedia.org/wiki/Bcrypt

    链接地址: http://www.djcxy.com/p/21843.html

    上一篇: Salt and passwords

    下一篇: password salt storing