在我们开始之前:是的我知道我应该使用PHP的password_hash
函数,当实际上存储密码。这是一个关于PHP哈希系统内部的问题。PHP bcrypt不一致的盐
所以我在前几天搞乱了PHP的crypt
函数,我注意到bcrypt有一些奇怪的行为。
$password = "totallyagoodpassword";
$salt = "hereisa22charactersalt";
$parameter = '$2y$10$' . $salt;
echo $parameter . PHP_EOL;
echo crypt($password, $parameter);
根据PHP's manual,此代码应哈希 “totallyagoodpassword
” 使用bcrypt,盐析为 “hereisa22charactersalt
”。该散列的输出应该是方案(“$2y$10$
”),接着是盐的22个字符,然后是31个字符的散列。因此,我应该预期“$2y$10$hereisa22charactersalt
”,然后是31个随机的base64字符。
于是我运行代码:
$2y$10$hereisa22charactersalt
$2y$10$hereisa22charactersalev7uylkfHc.RuyCP9EG4my7WwDMKGRvG
我不禁注意到我传入crypt
盐和说出来的盐是如何不一样的;具体而言,最后一个角色神奇地变成了“e
”。在用不同的salt运行这个之后,我仍然会得到同样的怪癖,即输出哈希的最后一个字符是唯一不同的。
我不是PHP的开发人员,所以我确信这种行为背后有一些逻辑。但我很好奇。
大部分的研究,我上完成bcrypt似乎表明盐是128位,其中以base64(忽略填充)编码时,使最多22个字符。对我来说,PHP并不需要22个字符,然后不会全部使用它们。 另外我尝试了和没有最后的“'''”,它似乎没有任何区别。 – Kilo