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

Jun*_*Dev 1 encryption laravel laravel-5

我正在寻找一种加密数据库中用户电子邮件的方法。由于加密总是生成其他字符串,因此失败。所以我拿了sha1。

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

 protected function credentials(Request $request)
 {
    return ['email' => sha1(strtolower($request->email)), 'password' => ($request->password)];
 }
Run Code Online (Sandbox Code Playgroud)

这对于登录/注册非常有用。但是重置密码存在问题。

重置密码使用SendsPasswordResetEmails特性。

那里有这个凭证方法:

protected function credentials(Request $request)
{
    return $request->only('email');
}
Run Code Online (Sandbox Code Playgroud)

这总是失败,因为它找不到用户(因为用户是用sha1电子邮件保存的)

如果我将其更改为 return ['email' => sha1(strtolower($request['email']))];

我收到错误消息,表明电子邮件不在正确的RFC标准中,无法发送电子邮件。问题是,我找不到真正的地方,laravel是使用此电子邮件为用户搜索的地方。无论如何,我根本不知道如何解决这个问题。

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

dpa*_*oli 5

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

加密是一种双向功能,也就是说,如果您可以加密电子邮件,则可以使用反向功能对其进行解密,如果您知道加密密钥,则可以获得原始电子邮件。

散列一种单向函数,也就是说,如果您对密码进行散列则无法通过反向功能获得原始密码,则只能验证,当再次输入密码时,所获得的散列与原始散列匹配,因此您只知道两个密码相同。

通常,您存储的密码是散列而不是加密的,因此,即使管理员也无法恢复原始密码,他只会验证用户输入的哈希是否与输入的原始密码相匹配。

您可以在以下stackoverflow问题中阅读更多内容:哈希密码和加密密码之间的区别

sha1()是一个散列函数,所以不可逆式,你不能获取原始邮件。

Laravel具有功能encrypt()decrypt()对事物进行加密的功能,请参阅有关加密文档,并具有对Hash::make()密码进行哈希处理和Hash::check()验证密码的功能,请参见有关hashing文档

因此,如果您想加密电子邮件而不是用sha1对其进行哈希处理,则应使用encrypt()decrypt()

最好的方法是使用mutators,即:

public function getEmailAttribute($value)
{
    return decrypt($value);
}

public function setEmailAttribute($value)
{
    $this->attributes['email'] = encrypt($value);
}
Run Code Online (Sandbox Code Playgroud)

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

但是我必须警告您,使用加密的电子邮件,登录过程不可挽回地中断了,您必须使用另一个唯一字段(例如username用于login),而不是电子邮件,因此在登录控制器中,您必须编写:

public function username()
{
    return 'username';
}
Run Code Online (Sandbox Code Playgroud)