Laravel 4.1 Hash ::使不一致

时间:2014-02-13 06:09:40

标签: php login hash laravel-4

我试图将数据库中的哈希密码与密码进行匹配 - 从登录表单中进行哈希处理,无论如何都不匹配。

然后我做了一些一致性测试。

$password = Hash::make('secret');
echo $password;

每次刷新页面时,我都会得到不同的结果。不像md5,它是一致的。

我错过了什么吗?

或者我使用/做错了吗?

为什么Hash :: make会使用相同的args产生不一致的结果?

2 个答案:

答案 0 :(得分:2)

这是正确的,这是设计的。

AFAIK,该函数使用password_hash() php函数,默认为PASSWORD_BCRYPT标志,

  

PASSWORD_BCRYPT - 使用CRYPT_BLOWFISH算法创建   哈希值。这将使用。生成标准的crypt()兼容哈希   “$ 2y $”标识符。结果将始终是60个字符的字符串,或   失败就错了。

这意味着每次调用都会自动生成一个salt,并在中插入生成的字符串,其中包含:算法的标识符(在本例中为$2y$),迭代cost(默认为12),散列密码和生成的随机盐。

这意味着,因此,每次您对密码进行哈希处理时,都会创建一个新的盐,因此字符串将始终不同 - 即使密码相同。与没有盐的简单md5哈希相比,这是的一个优势。

要检查它,你使用Hash :: check(),它使用password_verify()php函数,它分析哈希,猜测算法使用,采取,嵌入盐,因此可以检查程序,给定相同的起始条件,创建一个相同的哈希。

修改

确实,这是方法(Illuminate/Hashing/BcryptHasher

 * Hash the given value.
 *
 * @param  string  $value
 * @param  array   $options
 * @return string
 */
public function make($value, array $options = array())
{
    $cost = isset($options['rounds']) ? $options['rounds'] : $this->rounds;

    $hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost));

    if ($hash === false)
    {
        throw new \RuntimeException("Bcrypt hashing not supported.");
    }

    return $hash;
}

答案 1 :(得分:0)

Validator::extend('old_password', function($attribute, $value, $parameters) {
    return Hash::check($value, Auth::user()->password);
});

$rules = array(
    'old_password' => 'required|old_password',
    'new_password' => 'required|confirmed'
);
$messages = array(
   'old_password' => 'wrong old password'
);
$validator = Validator::make($data = $input, $rules, $messages);