使用Laravel auth::尝试散列密码


Using Laravel auth::attempt with hashed password

这似乎是一个非常简单的,但我真的不能弄清楚。我想在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(),告诉它使用它,因为它是,而不是试图重新哈希它(我认为它)?

可以手动登录用户

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

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

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

不要认为API和使用网页有任何不同——在网站上提交表单之前,你不需要设置密码,相反,如果你需要那种级别的安全,你可以依赖https/SSL。

Laravel使用的散列方法每次都会生成不同的散列(即使是相同的字符串)。你可以在Laravel的哈希中了解更多。正如您所读到的,它不会对两个字符串进行散列并比较它们,而是使用未散列的字符串与散列进行比较。

如果你真的想这样做,你需要实现你自己的认证提供者和一个不同的哈希算法,允许你比较哈希。

如果你担心安全,你应该考虑HTTPS,这样安全细节(包括密码)永远不会以明文形式发送。