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是使用此电子邮件为用户搜索的地方。无论如何,我根本不知道如何解决这个问题。
我想对电子邮件本身进行加密,因为在德国,有一项法律强迫我们存储加密的个人数据,例如电子邮件。
首先要说的是,散列与加密不同。
加密是一种双向功能,也就是说,如果您可以加密电子邮件,则可以使用反向功能对其进行解密,如果您知道加密密钥,则可以获得原始电子邮件。
散列是一种单向函数,也就是说,如果您对密码进行散列,则无法通过反向功能获得原始密码,则只能验证,当再次输入密码时,所获得的散列与原始散列匹配,因此您只知道两个密码相同。
通常,您存储的密码是散列而不是加密的,因此,即使管理员也无法恢复原始密码,他只会验证用户输入的哈希是否与输入的原始密码相匹配。
您可以在以下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)
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |