PHP密码\u哈希函数salt长度是21还是22?

PHP密码\u哈希函数salt长度是21还是22?,php,salt,bcrypt,password-hash,php-password-hash,Php,Salt,Bcrypt,Password Hash,Php Password Hash,代码: 结果: echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-characters'] ); echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-charactersA'] ); 代码: Warning: password_hash(): Provided salt is

代码:

结果:

echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-characters'] );
echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-charactersA'] );
代码:

Warning: password_hash(): Provided salt is too short: 21 expecting 22 
$2y$10$dHdlbnR5LW9uZS1jaGFyYOVyX13hK9eb4/KXMAkHsAJX..YR7t/32
结果:

echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-characters'] );
echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-charactersA'] );
代码:

Warning: password_hash(): Provided salt is too short: 21 expecting 22 
$2y$10$dHdlbnR5LW9uZS1jaGFyYOVyX13hK9eb4/KXMAkHsAJX..YR7t/32
问题:

echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-characters'] );
echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-charactersA'] );
如您所见,通过将A和B添加到21个字符的字符串中,我们创建了两个22个字符的不同字符串,但是,哈希是相同的!那就是第22个字符被忽略了?如果它被忽略了,为什么它要求22个字符的盐


BCrypt需要一个给定字母表的盐:
/0123456789abcdefghijklmnopqrstuvwxyzabefghijklmnopqrstuvxyz
。正如你所见,“-”不在里面,这就是你的盐无效的原因。可以在哈希值中看到明文的有效salt

在大多数情况下,最好省略salt参数。如果没有此参数,函数将从操作系统的随机源生成加密安全的salt

echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-charactersB'] );

$2y$10$dHdlbnR5LW9uZS1jaGFyYOVyX13hK9eb4/KXMAkHsAJX..YR7t/32

然而,当你说BCrypt没有使用完整的22个字符时,你是对的。BCrypt似乎只使用126位的salt,而不是22个base64编码字符的128位。有关更多信息,您可以查看此讨论。

首先,请不要提供您自己的盐。生成它的工作不会比库做得更好。而使用静态盐(就像您在示例中所做的那样)危及安全性。让它自己生成盐(顺便说一下,我相信让盐进入是我在API中犯的最大错误)

最多21对22个字符,请读取

基本上,salt是base64编码的。这意味着盐的每6位被编码成8位。所以编码的salt的每个字节是6位

21个字符是126位。这意味着只使用第22个字符的一部分(前2个解码位)。使用
A
B
得到相同哈希的原因是两个字符的前导2位相同


事实上,第22个字节只有4个唯一的哈希

为什么你自己加盐而不使用默认算法?请阅读默认算法的注释,了解22个字符的详细信息saltBcrypt确实使用了完整的22个字符。但是它只使用了第22位的前2位…@ircmaxell-是的,这就是我的意思,我的答案怎么了?在任何情况下,我都会记得你的精彩链接。