在阅读了有关加盐和散列密码的几天后,我发现了一段实际的代码,它告诉我如何做到这一点。这是我发现的:
$blowfish_salt = bin2hex(openssl_random_pseudo_bytes(22));
$hash = crypt($data, "$2a$12$".$blowfish_salt);
这是一个好方法吗?
在阅读了有关加盐和散列密码的几天后,我发现了一段实际的代码,它告诉我如何做到这一点。这是我发现的:
$blowfish_salt = bin2hex(openssl_random_pseudo_bytes(22));
$hash = crypt($data, "$2a$12$".$blowfish_salt);
这是一个好方法吗?
password_hash,或者如果您使用的是旧版本,兼容性库openssl_random_pseudo_bytes有时会遇到性能问题。mcrypt_create_iv (size, MCRYPT_DEV_URANDOM)改为考虑。盐编码很棘手。十六进制没有最佳地使用空间,正常的 Base64 使用无效字符。
$salt = substr(strtr(base64_encode($randomSalt), '+', '.'), 0, 22);
应该做的伎俩。
结合这些你得到
$binarySalt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
$salt = substr(strtr(base64_encode($binarySalt), '+', '.'), 0, 22);
查看ircmaxell 博客上的七种方法来搞砸 BCrypt以进一步阅读。
您的代码没有任何问题。但是,我总是更喜欢尽可能使用现成的库进行密码散列。对于 PHP,PHPass上有一个出色的实现。
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
$hash = $pwdHasher->HashPassword( $password );
验证也为您完成。
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
你做对了。您生成的盐被认为是随机的并且足够长(注意每个密码的盐必须是唯一的)。您还使用了 bcrypt,它被认为是一种安全的密码散列算法。