Laravel 4 - 哈希相同的密码给出不同的值

时间:2014-06-24 08:00:30

标签: php authentication hash laravel-4

我正在尝试使用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 个答案:

答案 0 :(得分:30)

这是完全正常的,也是应该的方式。 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个字符