盐和密码
可能重复:
为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和迭代次数的三倍。
你完全错误地使用盐。 盐应该是不可预测的; 你的盐是完全相反的(固定)。 由于固定散列绝对没有好处,因此它似乎也指望攻击者不知道盐。 这是通过默默无闻的安全定义,这是另一个不好的做法。
你应该做的是:
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