Laravel 4 - 相同密码进行哈希处理得到不同的值

8

我正在尝试使用Auth::attempt() 方法对用户进行身份验证,但始终失败,最终我编写了以下代码:

$arr = array();
$arr['verified'] = Hash::make('1234') . ' ; ' . Hash::make('1234');
return json_encode($arr);

这是结果:

{"verified":"$2y$10$V4yXBUcxealfLrzOE\/xAD.sJ8qpNhrMA6K6dENBBXYqaVx1zSETgy ; $2y$10$C9xpOWLTUyfy1KL.Y3Tot.KWADmQYFK\/HAf6uZGGXTKcVh52qHS4m"}

正如您所看到的,第一个哈希值为$2y$10$V4yXBUcxealfLrzOE\/xAD.sJ8qpNhrMA6K6dENBBXYqaVx1zSETgy,而第二个哈希值为$2y$10$C9xpOWLTUyfy1KL.Y3Tot.KWADmQYFK\/HAf6uZGGXTKcVh52qHS4m。尽管在存储时我有一个60个字符的密码字段,但这与数据库无关。你有什么想法吗?
1个回答

34

这是完全正常的,也是它应该工作的方式。 Laravel使用Bcrypt进行散列,并在散列过程中生成一个随机盐。 盐将成为哈希的一部分,这就是您得到两个不同结果的原因。

验证算法会自动考虑盐。 这种方法使使用彩虹表几乎不可能。

这不是错误,而是额外的安全措施,无需额外努力。

根据您的示例,针对这两个哈希值进行验证将返回true:

<?php

$hash1 = Hash::make('1234'); // A hash is generated
$hash2 = Hash::make('1234'); // Another hash is generated that differs from the first one

var_dump(Hash::check('1234', $hash1) && Hash::check('1234', $hash2));

尽管$hash1$hash2包含不同的哈希值,但使用给定的基础字符串对它们进行验证将得到True。

生成的哈希长度为60个字符。因此,应确保存储哈希的列也具有至少60个字符的最小大小。


但我需要将哈希密码存储在数据库中,如何进行比较呢?因为密码不总是1234。我该如何在Auth::attempt()方法中使用它? - user3723418
1
@user3723418 - 随机盐将成为生成的哈希值的一部分,该盐从存储的哈希值中提取以验证输入的密码,只需使用Hash::check(),它会自动为您完成。 - martinstoeckli
1
@user3723418 使用Auth :: attempt()方法更容易。 一旦您的数据库中有散列盐(假定正确的数据库设计),laravel将自动检查输入是否与数据库中的字段匹配。 如果数据库中有密码字段和数组中传递给Auth :: attempt()方法的密码键,则laravel将自动根据这两个值进行哈希处理,然后进行会话处理。 - thpl
但是我已经对密码进行了哈希处理,精确地复制并存储到数据库中,然后再次使用相同的密码尝试登录,但仍然失败了。 - user3723418
您的密码字段在数据库中有60个字符吗? - thpl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接