Laravel Encryptable Trait失败身份验证

时间:2018-04-26 17:45:57

标签: laravel authentication encryption

我的Laravel 5.5中的身份验证处理遇到了麻烦。我根据this post here安装了Encryptable特征。然后我使用身份验证生成器来建立基本路由,视图和处理程序。

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

Auth::attempt($credentials)电话中,这似乎失败了。我的故障排除指向可加密的特性,因为当我评论该部分时,身份验证工作正常。

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

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

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

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

我很欣赏所有的见解, 丹

1 个答案:

答案 0 :(得分:0)

这种加密形式将使您无法在表中搜索加密字段。您将无法重现相同的字符串,因为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中运行可以让您看到加密在后续运行中返回一个完全不同的值:

>>> 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="

因此,您可能希望选择实际加密的内容。加密敏感的东西,你不会用来查找实体。这可能类似于社会安全号码,政府ID,信用卡号码和银行帐号。