生成随机盐并在Bcrypt中使用它

时间:2017-06-28 17:32:13

标签: php random hash bcrypt salt

我正在尝试生成一个用于散列密码的随机盐。 我对密码散列有点新,但形成我所理解的,当使用BCrypt算法时,你会得到一个60个字符长的散列字符串。

这60个字符中的22个字符应该是salt值,它将附加到生成的哈希值。

我使用了一个简单的代码来确保随机生成的salt与将要添加到实际哈希中的盐相同:

$salt = substr(strtr(base64_encode(openssl_random_pseudo_bytes(22)), '+', '.'), 0, 22);
echo "Salt Value is: ".$salt . "\n";

输出结果为:盐值为:XKFB8DHMiXaYTzRAHtRhX7

然后我使用相同的生成盐加密密码,如下所示:

$cost = 8; 
$EncryptedPassword = password_hash($Password, PASSWORD_BCRYPT, ['cost' => $cost,'salt' => $salt]);
echo "Encrypted Password: " . $EncryptedPassword . "\n";

输出不是我的预期:

加密格式:$ 2y $ 10 $ XKFB8DHMiXaYTzRAHtRhXutlLLG8XIZjj5XGeyoUZobEtnkOn / M / S 所产生的盐不完全是我用于散列的盐,即盐值的最后一个字符总是不同的。

随机生成的盐是:XKFB8DHMiXaYTzRAHtRhX7

产生的盐值为:XKFB8DHMiXaYTzRAHtRhXu

我的问题是可能出现什么问题,如何在密码散列字符串中嵌入相同的随机生成的salt值而不更改它?

1 个答案:

答案 0 :(得分:1)

使用password_hash()和PHP的伴随password_verify()更简单,更安全。

使用CRYPT_BLOWFISH算法创建哈希。这将使用“$ 2y $”标识符生成标准的crypt()兼容哈希。

需要提供

无盐,最好不要提供一个,在PHP 7.x中,盐选项已被删除。

示例:password_hash("aPassword", PASSWORD_BCRYPT)