在mysql数据库中存储密码的最佳方法?

时间:2012-09-20 19:20:21

标签: php mysql passwords

  

可能重复:
  How to best store user information and user login and password
  How do you use bcrypt for hashing passwords in PHP?

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

谢谢!

5 个答案:

答案 0 :(得分:8)

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

您可以找到示例Here

答案 1 :(得分:3)

您应该使用 bcrypt 来哈希密码,它专为哈希密码而设计。

密码的哈希函数应该(需要一些计算时间)。大多数哈希算法(如SHA-1和MD5,甚至SHA-256)都设计得很快,但这使得它成为暴力攻击的简单目标。一个现成的GPU能够计算出每秒大约8 Giga的MD5哈希值!

不要害怕使用bcrypt!它不仅适用于高安全性站点,使用它可以像使用md5哈希一样简单。建议使用像[{3}}这样完善的库,如果你想了解它是如何实现的,你可以阅读这个phpass,我试着解释最重要的一点。

更新:

当前的PHP版本提供了处理密码的函数articlepassword_hash()。像这样使用它们:

// 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);

答案 2 :(得分: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
}

盐前缀$2a$(阅读文档)指示crypt使用Blowfish。假设底层操作系统中crypt(3)的实现支持它,你可以“免费”获得它。

答案 3 :(得分:-3)

md5 \ sha1 +独特的盐=最佳方式

不要偏执。

答案 4 :(得分:-5)

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

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

我发现这是不必要的,所以我使用的是SHA512 hash("sha512",$pw);