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

Generating a Random Salt and use it in Bcrypt

我正在尝试生成一个随机盐以用于对密码进行哈希处理。 我对密码散列有点陌生,但据我了解,当使用 BCrypt 算法时,您将得到一个 60 个字符长的散列字符串。

这 60 个字符中的 22 个字符应该是 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

我的问题是可能是什么问题,我怎样才能在不更改密码散列字符串的情况下获得相同的随机生成的盐值?

只用password_hash() and the companion password_verify()代替PHP更简单也更安全。

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

不需要提供salt最好不要提供,在PHP7.x中salt选项已被删除

示例:password_hash("aPassword", PASSWORD_BCRYPT)