使用密码“testtest”和带有以下代码的哈希“KFtIFW1vulG5nUH3a0Mv”会产生不同的哈希值,具体取决于PHP版本(如下图所示):
$salt = "KFtIFW1vulG5nUH3a0Mv";
$password = "testtest";
$key = '$2a$07$';
$key = $key.$salt."$";
echo crypt($password, $key);
输出1(PHP v.5.3.0 - 5.4.41,5.5.21 - 5.5.25,5.6.5 - 5.6.9):$2a$07$KFtIFW1vulG5nUH3a0Mv$.0imhrNa/laTsN0Ioj5m357/a8AxxF2q
输出2(PHP v.5.5.0 - 5.5.20,5.6.0 - 5.6.4):$2a$07$KFtIFW1vulG5nUH3a0Mv$e0imhrNa/laTsN0Ioj5m357/a8AxxF2q
以下是问题的示例: http://3v4l.org/dikci
如果使用crypt来记录登录密码,这是一个大问题,因为根据PHP版本,哈希值会有所不同。有谁知道这个问题是什么以及如何处理它?</ p>
答案 0 :(得分:2)
这不是你想象的那么大的问题。
首先你应该注意,你的代码并不是绝对正确的,BCrypt需要22个字符的盐,但你提供了20个字符的盐。这意味着终止'$'(这不是必需的btw)将被视为salt的一部分,以及密码的第一个字母。 $
不是BCrypt盐的有效字符。
要考虑的另一件事是,并非所有字符22的位都被使用,这是由于编码,ircmaxell对此给出了good explanation。因此,不同的盐可以产生相同的哈希值,您可以在answer中看到这一点。不同的实现如何处理角色22的最后位可以在理论上改变。只要crypt函数可以使用两个哈希验证密码,就没有问题。
盐的产生及其缺陷是其中一个原因,为什么函数password_hash()和password_verify()写在哪里,它们使密码处理更容易。