首页 > 解决方案 > Laravel 可加密特征认证失败

问题描述

我在我的 Laravel 5.5 中遇到了身份验证处理问题。我Encryptable根据这里的这篇文章安装了一个特征。然后,我使用身份验证生成器来建立基本路由、视图和处理程序。

我可以成功注册新帐户并直观地看到所有数据都已加密,但我无法通过登录屏幕成功进行身份验证。

这似乎在Auth::attempt($credentials)通话期间失败了。我的故障排除指向可加密特征,因为当我注释掉该部分时,身份验证工作正常。

有人可以提供有关如何使用这种模型加密方法处理身份验证的见解吗?

我尝试禁用用户名字段的加密,但这似乎没有帮助。密码字段从未被加密,因为它正在被 bcrypt 散列。

第一次编辑:因此,了解特征如何工作......Encryptable特征似乎重载了 getAttribute/setAttribute 函数。这意味着 Eloquent 的 , 等查询函数wherefind只是“查看”加密值。

第二次编辑:为特征提供的源代码Encryptable没有为未加密的值返回正确的值。这已更改并恢复了身份验证。对于那些使用相同代码片段的人,在get_attribute()函数中更改else块,使其return $value;.

我感谢所有的见解,丹

标签: laravelauthenticationencryption

解决方案


这种形式的加密将使您无法在表格中搜索加密字段。您将无法重现相同的字符串,因为 Laravel 在生成加密数据时使用了随机 iv。IV 或初始化向量与散列中的盐具有类似的目的,以随机化存储的数据。

由于数据的这种随机化,您甚至无法通过重新加密搜索数据来搜索您的表:

User::where('email', Crypt::encrypt('email@email.com')); 
// won't find anything even if an encrypted value of email@email.com exists

在交互式 shell 中运行可以让您看到 encrypt 在后续运行中返回完全不同的值:

>>> json_decode(base64_decode(Crypt::encrypt('email@email.com')))->value
=> "zpA0LBsbkGCAagxLYB6kiqwJZmm7HSCVm4QrUw6W8SE="
>>> json_decode(base64_decode(Crypt::encrypt('email@email.com')))->value
=> "VKz8CWVzR66cv/J7J09K+TIVwQPxcIg+SDqQ32Sr7rU="

因此,您可能希望对实际加密的内容有所选择。加密敏感的东西,你不会用它来查找实体。这可能是诸如社会安全号码、政府身份证、信用卡号码和银行帐号之类的东西。


推荐阅读