【问题标题】:laravel Hash::make keep giving a different resultslaravel Hash::make 不断给出不同的结果
【发布时间】:2014-08-15 06:40:03
【问题描述】:

我想在 laravel 4 中使用身份验证 我改变了桌子和 mobel 的名字

用户注册时,我有密码并保存,哈希为:

$password = Hash::make(Input::get('password'));

然后当用户登录时,我想先验证他/她的身份。我是这样做的:

if (Auth::attempt(array('username' => Input::get('usernaem'), 'password' => Hash::make(Input::get('password')))))
{
    return Redirect::intended('dashboard');
}

这永远不会成功。我尝试调试代码,似乎Hask::make 函数总是给出不同的结果。

我是否使用了良好的身份验证方法?该哈希函数的解决方案是什么?

非常感谢

【问题讨论】:

  • 是的,Hash 每次都会给出不同的结果。使用Hash::check($plain, $hashed) 进行比较。和答案一样,不要在Auth::attempt 方法中使用哈希器
  • Hash::make() 每次执行时都会给出不同的结果,因为它每次都使用不同的盐......这就是为什么它比使用固定盐进行散列更安全......这就是为什么你也有 Hash::check()
  • @MarkBaker 很好的信息,谢谢
  • @deczo 你的意思和第一个答案一样吗?

标签: php laravel laravel-4 blade


【解决方案1】:

一开始尝试的时候不要使用Hash,应该是这样的:

Auth::attempt(array('username' => Input::get('username'), 'password' => Input::get('password')));

因为您通过使用Hash::make() 生成哈希值手动将密码存储在数据库中,然后将其粘贴到数据库中。所以这可能是个问题。将密码重新输入数据库并务实插入,然后重试。

另外,您可以使用Hash::check('password', $hashedPassword) 检查密码。在Laravel 网站上阅读更多关于security 的信息。使用迁移填充虚假数据,不要手动将任何数据放入数据库。

【讨论】:

    【解决方案2】:

    不要在 auth::attempt() 函数中对密码进行哈希处理,代码应该是这样的:

    Auth::attempt(array('username' => Input::get('username'), 'password' => Input::get('password')));
    

    auth::attempt() 会对密码进行哈希处理,然后检查它是否与存储在数据库中的密码匹配

    【讨论】:

      【解决方案3】:

      为了给答案添加一些解释,每次都不同,因为哈希算法bcrypt会生成一个必须用于解密密码的随机字符串(盐)。

      这是为了保护密码免受彩虹表攻击。 https://en.wikipedia.org/wiki/Rainbow_table

      【讨论】:

        猜你喜欢
        • 2014-03-11
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        • 2017-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多