Laravel 5.8-保存加密的用户电子邮件

Laravel 5.8-保存加密的用户电子邮件,laravel,laravel-5,encryption,Laravel,Laravel 5,Encryption,我正在寻找一种方法来加密数据库中的用户电子邮件。因为加密总是生成不同的字符串,所以它失败。 所以我选了sha1 在AuthenticatesUsers中,我已将凭据方法更改为: protected function credentials(Request $request) { return ['email' => sha1(strtolower($request->email)), 'password' => ($request->password)];

我正在寻找一种方法来加密数据库中的用户电子邮件。因为加密总是生成不同的字符串,所以它失败。 所以我选了sha1

在AuthenticatesUsers中,我已将凭据方法更改为:

 protected function credentials(Request $request)
 {
    return ['email' => sha1(strtolower($request->email)), 'password' => ($request->password)];
 }
这对于登录/注册非常有用。但是重置密码时会出现问题

重置密码使用SendsPasswordResetEmails特性

这里有一个凭据方法:

protected function credentials(Request $request)
{
    return $request->only('email');
}
此操作总是失败,因为它找不到用户(因为用户与sha1电子邮件一起保存)

如果我把它改成
return['email'=>sha1(strtolower($request['email'])

我得到的错误是,电子邮件不在正确的RFC标准中,无法发送电子邮件。问题是,我真的找不到laravel用这封电子邮件搜索用户的地方。不管怎样,我真的不知道该如何解决这个问题


我想对电子邮件本身进行加密,因为在德国有一项法律强制我们存储加密的个人数据,就像电子邮件一样。

首先要说的是,散列加密不同

加密是一种双向功能,即如果您可以加密电子邮件,您可以使用反向功能解密它,如果您知道加密密钥,并获得原始电子邮件

哈希是一个单向函数,也就是说,如果对无法获得的密码进行哈希使用反向函数获得原始密码,则只能验证再次输入密码时,获得的哈希与原始哈希匹配,因此您只知道两个密码是相同的

您通常将密码存储为散列,而不是加密,因此即使管理员也无法恢复原始密码,他只能验证来自用户的输入是否具有与其输入的原始密码相匹配的散列

您可以在此stackoverflow问题中阅读更多内容:

sha1()
是一个散列函数,因此是不可逆的,您无法获取原始电子邮件

Laravel有函数
encrypt()
decrypt()
来加密内容,请参阅,并有函数
Hash::make()
来散列密码和
Hash::check()
来验证密码,请参阅

因此,如果您想加密电子邮件,而不是使用sha1散列,则应使用
encrypt()
decrypt()

您最好的方式是使用,即:

因此,您将在数据库中加密电子邮件,并且您可以在代码中使用
$user->email

但我必须警告您,使用加密电子邮件,登录过程将无法修复地中断,您必须为登录使用另一个唯一字段,如
用户名
,而不是电子邮件,因此您必须在登录控制器中写入:

public function username()
{
    return 'username';
}

首先要说的是,散列与加密不同

加密是一种双向功能,即如果您可以加密电子邮件,您可以使用反向功能解密它,如果您知道加密密钥,并获得原始电子邮件

哈希是一个单向函数,也就是说,如果对无法获得的密码进行哈希使用反向函数获得原始密码,则只能验证再次输入密码时,获得的哈希与原始哈希匹配,因此您只知道两个密码是相同的

您通常将密码存储为散列,而不是加密,因此即使管理员也无法恢复原始密码,他只能验证来自用户的输入是否具有与其输入的原始密码相匹配的散列

您可以在此stackoverflow问题中阅读更多内容:

sha1()
是一个散列函数,因此是不可逆的,您无法获取原始电子邮件

Laravel有函数
encrypt()
decrypt()
来加密内容,请参阅,并有函数
Hash::make()
来散列密码和
Hash::check()
来验证密码,请参阅

因此,如果您想加密电子邮件,而不是使用sha1散列,则应使用
encrypt()
decrypt()

您最好的方式是使用,即:

因此,您将在数据库中加密电子邮件,并且您可以在代码中使用
$user->email

但我必须警告您,使用加密电子邮件,登录过程将无法修复地中断,您必须为登录使用另一个唯一字段,如
用户名
,而不是电子邮件,因此您必须在登录控制器中写入:

public function username()
{
    return 'username';
}

可以我试过了。如果我注册了一个新用户,我会加密用户的电子邮件。现在在AuthenticatesUsers.php凭据方法中,我执行返回“email”=>decrypt($request->email)…-当然,$request->email是普通的电子邮件。没有任何加密。所以这是行不通的。我不知道用户的登录名在哪里,所以我可以在那里查看电子邮件。你可以使用变异器,这样你就不必担心在代码中加密或解密到哪里,我已经编辑了答案。我使用了变异器。此外,我还做了使用用户名所必需的所有更改。我现在可以使用用户名等登录。不过,如果我想重置密码,laravel auth正在尝试获取仍然加密的电子邮件。我真的不明白为什么laravel没有解密电子邮件,因为我的用户模型中有解密电子邮件属性mutator好的,我发现了错误。在测试用户的用户工厂中,我正在加密电子邮件。但因为我有一个变异器,如果设置了它,它也会对电子邮件进行加密。这封电子邮件加密了两次。那是w