我习惯于使用现已过时的md5(),而我听说sha1()也不安全。那么现在考虑到安全性,究竟什么是最好的方法来存储和检索数据库中的密码呢?如果您能提供一个小例子,我会非常高兴。
谢谢!
我习惯于使用现已过时的md5(),而我听说sha1()也不安全。那么现在考虑到安全性,究竟什么是最好的方法来存储和检索数据库中的密码呢?如果您能提供一个小例子,我会非常高兴。
谢谢!
您应该使用 bcrypt 来哈希您的密码,它专门为哈希密码而设计。
用于密码的哈希函数应该是 慢速的(需要一些计算时间)。大多数哈希算法如 SHA-1 和 MD5 或者甚至 SHA-256 都是为了速度而设计的,但这使它成为暴力攻击的易受攻击目标。一个现成的 GPU 能够每秒计算约 8 十亿个 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);
我们使用Blowfish算法的crypt
函数:
// 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)
实现支持它,您可以"免费"获得它。
. substr(hash('whirlpool', microtime()), rand(0, 105), 22)
。 - Brendan Longcrypt
的盐。 - Sean Brightrand()
,你的应用程序就会更加安全,显然。 微笑 - Sean Bright你可以查找很多加密代码或者像这样混合使用它们:
sha1(md5(sha1($pw)));
我发现这没有必要,所以我使用的是SHA512 hash("sha512",$pw);