我使用以下代码加密laravel 5.3中的电子邮件。我已将此加密的电子邮件值存储在数据库中。
use Encryptable;
protected $encryptable = [
'firstname', 'lastname','email','phone'
];
当我登录时,我使用以下代码加密我在登录表单中输入的电子邮件。每次加密都给出不同的值,因此当我将此值与数据库值进行比较时,比较失败并且无法登录。请告诉我这里我缺少的东西。
if (Auth::attempt(['email' => Crypt::encrypt(Input::get('email')), 'password' => Input::get('password') ])) {
// Authentication passed...
return redirect()->intended('dashboard');
}
else{
return redirect()->back()
->withInput()
->withErrors([
$this->username() => Lang::get('auth.failed'),
]);
}
编辑:您的示例不起作用的原因是因为如果您运行Crypt::encrypt(Input::get('email'))
两次,您将得到两个不能比较的不同可解密字符串。
为了补充我的评论,您必须在用户对象上保存电子邮件哈希值和加密电子邮件值,然后您将能够使用哈希值查找/登录用户,并在您的软件需要时解密电子邮件地址(即显示在帐户页面,忘记密码电子邮件等)
因此,您将encrypted_email
和email
将电子邮件视为哈希
$emailHash= Hash::make(Input::get('email'));
$password = Input::get('password');
Auth::attempt(['email'=> $emailHash, 'password' => $password]);
如果您想显示或使用电子邮件地址,您将解密用户对象上的encrypted_email
字段。
$email = decrypt($user->encryptedEmail);