我正在尝试生成一个用于散列密码的随机盐。 我对密码散列有点新,但形成我所理解的,当使用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值而不更改它?
答案 0 :(得分:1)
使用password_hash()和PHP的伴随password_verify()更简单,更安全。
使用CRYPT_BLOWFISH算法创建哈希。这将使用“$ 2y $”标识符生成标准的crypt()兼容哈希。
需要提供无盐,最好不要提供一个,在PHP 7.x中,盐选项已被删除。
示例:password_hash("aPassword", PASSWORD_BCRYPT)