此代码片段是否足以用于密码哈希和盐

信息安全 密码 哈希 php
2021-08-16 21:02:14

在阅读了有关加盐和散列密码的几天后,我发现了一段实际的代码,它告诉我如何做到这一点。这是我发现的:

$blowfish_salt = bin2hex(openssl_random_pseudo_bytes(22));  
$hash = crypt($data, "$2a$12$".$blowfish_salt);  

这是一个好方法吗?

3个回答
  1. 使用php 5.5功能更容易password_hash,或者如果您使用的是旧版本,兼容性库
  2. openssl_random_pseudo_bytes有时会遇到性能问题。mcrypt_create_iv (size, MCRYPT_DEV_URANDOM)改为考虑。
  3. 盐编码很棘手。十六进制没有最佳地使用空间,正常的 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,它被认为是一种安全的密码散列算法。