我习惯使用我知道现在已经过时的 md5() 并且我听说 sha1() 也不安全。那么,考虑到安全性,如今在数据库中存储和检索密码的最佳方式是什么?如果你能提供一个小例子,我会很高兴。
谢谢!
我习惯使用我知道现在已经过时的 md5() 并且我听说 sha1() 也不安全。那么,考虑到安全性,如今在数据库中存储和检索密码的最佳方式是什么?如果你能提供一个小例子,我会很高兴。
谢谢!
我建议看一下 bcrypt,因为它可以帮助抵御暴力攻击。http://codahale.com/how-to-safely-store-a-password/
你可以在这里找到例子
你真的应该使用bcrypt来散列你的密码,它是专门为散列密码而设计的。
密码的哈希函数应该很慢(需要一些计算时间)。大多数哈希算法(如 SHA-1 和 MD5 甚至 SHA-256)都被设计为速度很快,但这使得它很容易成为暴力攻击的目标。一个现成的 GPU 每秒能够计算大约 8 Giga MD5 哈希!
不要害怕使用 bcrypt!它不仅适用于高安全性站点,而且使用起来就像使用 md5 哈希一样简单。建议使用像phpass这样完善的库,如果你想了解它是如何实现的,你可以阅读这篇文章,我试图解释最重要的点。
更新:
当前的 PHP 版本提供了函数password_hash()和password_verify()来处理密码。像这样使用它们:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
我们crypt
与 Blowfish 一起使用:
// Hash our password
$hashed = crypt($plain_text_password, '$2a$08$' . substr(hash('whirlpool', microtime()), rand(0, 105), 22));
// Validate a password
if (crypt($plain_text_password, $hashed) == $hashed)) {
// Valid password
}
salt 前缀$2a$
(阅读文档)指示crypt
使用 Blowfish。并且假设crypt(3)
底层操作系统中的实现支持它,您就可以“免费”获得它。
md5\sha1 + 独特的盐 = 最好的方法
不要偏执。
您可以查找很多加密代码或混合它们,例如:
sha1(md5(sha1($pw)));
我觉得没有必要,所以我使用的是 SHA512hash("sha512",$pw);