7

可能重复:
如何最好地存储用户信息和用户登录名和
密码 在 PHP 中如何使用 bcrypt 散列密码?

我习惯使用我知道现在已经过时的 md5() 并且我听说 sha1() 也不安全。那么,考虑到安全性,如今在数据库中存储和检索密码的最佳方式是什么?如果你能提供一个小例子,我会很高兴。

谢谢!

4

5 回答 5

9

我建议看一下 bcrypt,因为它可以帮助抵御暴力攻击。http://codahale.com/how-to-safely-store-a-password/

你可以在这里找到例子

于 2012-09-20T19:26:08.623 回答
5

你真的应该使用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);
于 2012-09-20T19:40:36.547 回答
2

我们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)底层操作系统中的实现支持它,您就可以“免费”获得它。

于 2012-09-20T19:23:21.243 回答
-3

md5\sha1 + 独特的盐 = 最好的方法

不要偏执。

于 2012-09-20T19:24:17.433 回答
-5

您可以查找很多加密代码或混合它们,例如:

sha1(md5(sha1($pw)));

我觉得没有必要,所以我使用的是 SHA512hash("sha512",$pw);

于 2012-09-20T19:24:30.153 回答