【问题标题】:PHP bcrypt Inconsistent SaltPHP bcrypt不一致的盐
【发布时间】:2016-07-21 15:36:44
【问题描述】:

开始之前: 是的,我知道当实际上 存储密码时我应该使用 PHP 的 password_hash 函数。这是一个关于 PHP 哈希系统内部的问题。

所以前几天我在搞乱 PHP 的 crypt 函数,发现 bcrypt 有一些奇怪的行为。

$password = "totallyagoodpassword";
$salt = "hereisa22charactersalt";

$parameter = '$2y$10$' . $salt;

echo $parameter . PHP_EOL;
echo crypt($password, $parameter);

根据PHP's manual,此代码应使用 bcrypt 散列“totallyagoodpassword”,并使用“hereisa22charactersalt”对其进行加盐处理。这个散列的输出应该是方案(“$2y$10$”),后面是盐的22个字符,然后是散列的31个字符。因此,我应该期待“$2y$10$hereisa22charactersalt”,然后是 31 个随机 base64 字符。

所以我运行代码:

$2y$10$hereisa22charactersalt
$2y$10$hereisa22charactersalev7uylkfHc.RuyCP9EG4my7WwDMKGRvG

我不禁注意到我传递给crypt 的盐和出来的盐是不一样的;具体来说,最后一个字符神奇地变成了“e”。在用不同的盐运行它之后,我仍然得到同样的怪癖,其中输出哈希的最后一个和唯一的最后一个字符不同。

我不是 PHP 的开发人员,所以我确信这种行为背后有一些逻辑。但我很好奇。

【问题讨论】:

    标签: php bcrypt crypt


    【解决方案1】:

    文档没有说明输出将包括整个 22 个字节的盐。 crypt documentation 上的示例还显示了盐的最后一个“$”。

    crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')

    制作:

    $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

    【讨论】:

    • 我对 bcrypt 所做的大部分研究似乎表明盐是 128 位,当以 base64 编码时(忽略填充),组成 22 个字符。 PHP 需要 22 个字符然后不使用所有字符对我来说真的没有意义。我也尝试了使用和不使用最终的“$”,但似乎没有任何区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多