PHP bcrypt不相容盐

PHP bcrypt不相容盐,php,bcrypt,crypt,Php,Bcrypt,Crypt,开始之前:是的,我知道在实际存储密码时应该使用PHP的密码\u散列函数。这是一个关于PHP哈希系统内部的问题 所以前几天我在玩PHP的crypt函数,我注意到bcrypt有一些奇怪的行为 $password = "totallyagoodpassword"; $salt = "hereisa22charactersalt"; $parameter = '$2y$10$' . $salt; echo $parameter . PHP_EOL; echo crypt($password, $pa

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

所以前几天我在玩PHP的
crypt
函数,我注意到bcrypt有一些奇怪的行为

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

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

echo $parameter . PHP_EOL;
echo crypt($password, $parameter);
根据,此代码应使用bcrypt对“
TotalYagoodPassword
”进行散列,并使用“
hereisa22charactersalt
”对其进行盐析。此散列的输出应为方案(“
$2y$10$
”),然后是盐析的22个字符,然后是散列的31个字符。因此,我应该期望“
$2y$10$hereisa2charactersalt
”,然后是31个随机base64字符

所以我运行代码:

$2y$10$hereisa22charactersalt
$2y$10$hereisa22charactersalev7uylkfHc.RuyCP9EG4my7WwDMKGRvG
我忍不住注意到我放进地下室的盐和放出来的盐是不一样的;具体来说,最后一个字符神奇地变成了“
e
”,在使用不同的盐运行之后,我仍然会遇到同样的怪癖,即输出哈希的最后一个也是唯一的最后一个字符是不同的


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

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

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

制作:


$2a$07$usesomesillystringfore2udlvp1iii2e./U9C8sBjqp8I90dH6hi

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

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

制作:


$2a$07$usesomesillystringfore2udlvp1iii2e./U9C8sBjqp8I90dH6hi

我对bcrypt所做的大部分研究似乎都表明salt是128位的,当用base64编码(忽略填充)时,它将构成22个字符。对我来说,PHP需要22个字符,然后不使用所有字符,这真的没有意义。此外,我尝试使用和不使用最后一个“
$
”,但似乎没有任何区别。我在bcrypt上所做的大多数研究似乎表明,salt是128位的,当用base64编码时(忽略填充),共有22个字符。对我来说,PHP需要22个字符,然后不使用所有字符,这真的没有意义。另外,我尝试了使用和不使用最后的“
$
”并且似乎没有任何区别。