【问题标题】:Using Laravel auth::attempt with hashed password使用 Laravel auth::attempt 和哈希密码
【发布时间】:2013-04-06 18:02:34
【问题描述】:

这看起来很简单,但我真的想不通。我想在 Laravel 4 中使用Auth::attempt($credentials),但密码已经过哈希处理(因为它是一个 API)。当我发送未散列的密码时它可以工作,但我不明白如何告诉 Auth “不散列”给定的密码。

快速“演示”

什么有效:

Auth::attempt([Request::getUser(), Request::getPassword()]);

curl --user username:notHashedPassword localhost:8000/api/

什么不起作用:

Auth::attempt([Request::getUser(), Request::getPassword()]);

curl --user username:$2y$08$xo7HpxFyeF2UKHOYs/e localhost:8000/api/

我是否可以将任何参数传递给 Auth::attempt(),告诉它按原样使用它而不是尝试重新散列它(就像我认为的那样)?

【问题讨论】:

  • 浏览代码:定义您自己的UserProviderInterface 实现,或者如果您想使用内置的db / eloquent 提供程序,请注册一个实现HasherInterface 的非散列类。

标签: php authentication laravel


【解决方案1】:

在发送密码之前,您真的不应该对密码进行哈希处理。在没有盐的情况下发送密码之前,您将如何正确地散列密码?如果您在发送密码之前可以访问 salt,那么您为什么要使用 API?

如果您担心传递未经哈希处理的密码的安全性,那么您应该使用 SSL 来确保数据的安全传输。

不要认为 API 与使用网页有任何不同——并且在您在网站上提交表单之前不要加盐密码,相反,如果您需要该级别的安全性,您可以依赖 https / SSL。

【讨论】:

    【解决方案2】:

    Laravel 使用的散列方法每次生成不同的散列(即使是相同的字符串)。您可以在Hashing for Laravel 中阅读更多相关信息。如您所见,它不会对两个字符串进行哈希处理并进行比较,而是使用未哈希处理的字符串与哈希值进行比较。

    如果您真的想这样做,您需要实现自己的 Auth Provider 和允许您比较哈希的不同哈希算法。

    如果您担心安全性,您应该考虑使用 HTTPS,这样安全详细信息(包括密码)就不会以纯文本形式发送。

    【讨论】:

      【解决方案3】:

      您可以手动登录用户

      $user = User::find($id);
      
      if ($user->password == Request::getPassword()) {
          Auth::login($user->id);
      }
      

      【讨论】:

      • 应该不可能比较生成的哈希值,因为它们每次都不一样。请参阅我的答案以获取解释它们为何不同的链接。
      猜你喜欢
      • 2018-05-20
      • 2013-07-12
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多