我正在寻找一种加密数据库中用户电子邮件的方法。由于加密总是生成其他字符串,因此失败。 所以我拿了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是使用此电子邮件为用户搜索的地方。无论如何,我根本不知道如何解决这个问题。
我想对电子邮件本身进行加密,因为在德国,有一项法律强制我们存储加密的个人数据,例如电子邮件。
答案 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