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

Best way to store passwords in a mysql database?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to best store user information and user login and password
How do you use bcrypt for hashing passwords in PHP?

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

谢谢您!


我建议你看看Bcrypt,因为它可以帮助你抵御暴力攻击。http://codahale.com/how-to-safety-store-a-密码/

你可以在这里找到例子


您真的应该使用bcrypt来散列密码,它是专门为散列密码而设计的。

密码的哈希函数应该很慢(需要一些计算时间)。大多数散列算法(如sha-1和md5,甚至sha-256)都设计得很快,但这使得它很容易成为暴力攻击的目标。一个现成的GPU能够计算大约每秒8千兆MD5哈希!

不要害怕使用bcrypt!它不仅适用于高安全性的站点,而且使用它和使用MD5哈希一样容易。建议使用像phpass这样的成熟库,如果您想了解如何实现它,可以阅读本文,在这里我试图解释最重要的几点。

更新:

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

1
2
3
4
5
6
7
// 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与河豚一起使用:

1
2
3
4
5
6
7
// 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使用河豚。假设底层操作系统中的crypt(3)的实现支持它,您就可以"免费"得到它。


MD5sha1+唯一盐=最佳方式

别妄想。


您可以查找大量加密代码或将它们混合,例如:

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

我觉得那是不必要的,所以我用的是sha512 hash("sha512",$pw);