PHP bcrypt不相容盐
开始之前:是的,我知道在实际存储密码时应该使用PHP的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
密码\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个字符,然后不使用所有字符,这真的没有意义。另外,我尝试了使用和不使用最后的“$
”并且似乎没有任何区别。