【问题标题】:Laravel 5.8 - save user emails encryptedLaravel 5.8 - 保存加密的用户电子邮件
【发布时间】:2019-08-03 21:52:46
【问题描述】:

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

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

【问题讨论】:

    标签: laravel laravel-5 encryption


    【解决方案1】:

    首先要说的是HashingEncryption不同。

    加密是一个双向功能,也就是说,如果你可以加密一封电子邮件,你就可以解密它带reverse功能,如果你知道加密密钥,就可以得到原邮件。

    散列是一个单向函数,也就是说,如果你散列一个你不能获得的密码原来的密码有反向功能,你只能验证当你再次输入密码的时候,你得到的hash和原来的hash一致,所以你只知道两个密码是一样的。 p>

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

    您可以在这个 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

    但我必须警告您,使用加密电子邮件时,登录过程将无法挽回损坏,您必须使用另一个唯一字段,例如username 用于登录,而不是电子邮件,所以在你的登录控制器中你必须写:

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

    【讨论】:

    • 好的。我试过了。如果我注册一个新用户,我会加密用户电子邮件。现在在 AuthenticatesUsers.php 凭据方法中,我执行 return 'email' => decrypt($request->email) ... - 这只是给我一个“有效负载无效。”
    • 当然,$request->email 是普通的电子邮件。没有任何加密。所以这行不通。我不知道用户在哪里登录,所以我可以在那里查看电子邮件。
    • 你可以使用mutators,所以你不必担心在你的代码中在哪里加密或解密,我已经编辑了答案。
    • 我使用了变异器。我还做了所有使用用户名所必需的更改。我现在可以使用用户名等登录。尽管如此,如果我想重置密码,laravel auth 会尝试获取仍然加密的电子邮件。我真的不明白为什么 laravel 不解密电子邮件,因为我的用户模型中有解密电子邮件属性 mutator
    • 好的,我找到了错误。在我的测试用户用户工厂中,我正在加密电子邮件。但是因为我有这个突变器,如果它被设置,它也会加密一封电子邮件。电子邮件被加密了两次。这就是解密无法正确解密的原因。
    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2022-01-06
    • 2016-10-05
    • 2020-02-28
    • 1970-01-01
    • 2018-12-25
    • 2019-10-21
    相关资源
    最近更新 更多