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

时间:2019-08-03 21:52:46

标签: laravel laravel-5 encryption

我正在寻找一种加密数据库中用户电子邮件的方法。由于加密总是生成其他字符串,因此失败。 所以我拿了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是使用此电子邮件为用户搜索的地方。无论如何,我根本不知道如何解决这个问题。

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

1 个答案:

答案 0 :(得分:5)

首先要说的是,哈希加密不同。

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

散列是一种单向功能,也就是说,如果您散列无法获得密码具有反向功能的原始密码,您只能验证,当再次输入密码时,所获得的哈希值与原始哈希值匹配,因此您只知道两个密码是相同的。

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

您可以在以下stackoverflow问题中进一步了解:Difference between Hashing a Password and Encrypting it

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

Laravel具有功能encrypt()decrypt()来加密事物,请参见docs on encryption,并具有功能Hash::make()来散列密码,而功能Hash::check()验证密码,请参阅docs on hashing

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

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

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

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

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

但是我必须警告您,使用加密的电子邮件后,登录过程会中断,这是无法挽回的,您必须为{<1>}使用另一个唯一字段,< strong>登录,而不是电子邮件,因此在登录控制器中,您必须输入:

username