【发布时间】: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 的开发人员,所以我确信这种行为背后有一些逻辑。但我很好奇。
【问题讨论】: