【发布时间】:2017-06-28 17:32:13
【问题描述】:
我正在尝试生成用于散列密码的随机盐。 我对密码散列有点陌生,但据我所知,当使用 BCrypt 算法时,你会得到一个 60 个字符长的散列字符串。
这 60 个字符中的 22 个字符应该是盐值,它被添加到生成的哈希值之前。
我使用了一个简单的代码来确保随机生成的盐与将要添加到实际哈希中的盐相同:
$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? php.net/manual/en/function.password-hash.php
-
你不需要生成盐,
password_hash()会为你做。 -
推荐使用 zaph 的答案,但如果您对截断盐的原因感兴趣,请阅读此explanation。
标签: php random hash bcrypt salt