Laravel 5.8 - save user emails encrypted

China☆狼群 提交于 2021-01-24 11:41:46

问题


I'm looking for a way to encrypt the user emails in the database. Since Encrypt always generates a different string, it fails. So I took sha1.

in AuthenticatesUsers I've changed the credentials method to:

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

This works great for the login/registration. But there are problems with resetting the password.

Resetting the password uses the SendsPasswordResetEmails trait.

There it this credentials method:

protected function credentials(Request $request)
{
    return $request->only('email');
}

This always fails, cause it does not find the user (cause the user is saved with sha1 email)

if I change it to return ['email' => sha1(strtolower($request['email']))];

I get the error, that the email is not in the right RFC standart, to send a email. The Problem is, I don't really find the place, where laravel is searchig for the user with this email. Anyway, I don't really have a clue, how I can solve this problem at all.

I want to encrypt the email itself, because in germany there is a law which forces us to store personal data encrypted, like the email.


回答1:


First thing to say is that Hashing is not the same as Encryption.

Encryption is a two way function, that is if you can encrypt an email you can decrypt it with a reverse function, if you know the encryption key, and obtain the original email.

Hashing is a one way function, that is if you hash a password you can't obtain the original password with a reverse function, you can only verify that, when you input the password again, the hash you obtain matches the original hash, so you only know that the two password are identical.

You usually store password hashed, not crypted, so even the administrator can't recover the original password, he con only verify that a input from a user has a hash that match the original password he entered.

You can read more in this stackoverflow question: Difference between Hashing a Password and Encrypting it.

The sha1() is a hashing function, so is not reversable, you can't obtain the original email.

Laravel has the functions encrypt() and decrypt() to encrypt things, see the docs on encryption, and has the functions Hash::make() to hash a password and Hash::check() to verify the password, see the docs on hashing.

So if you want to encrypt the emails, not hashing them with sha1, you should use encrypt() and decrypt().

The best way for you is to use mutators, i.e.:

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

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

So you will have email encrypted in the database and you can use $user->email in your code.

But I have to warn you that with encrypted email the login process is irreparably broken, you have to use another unique field like username for the login, not the email, so in your login controller you have to write:

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


来源:https://stackoverflow.com/questions/57342343/laravel-5-8-save-user-emails-encrypted

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!