使用where子句获取加密的数据

问题描述 投票:0回答:1

除主键(id)外,我的整个数据库均已加密。我需要使用$ email变量获取电子邮件。

$encrypted=registermodel::select('email')->where('email','=',$email)->get();
php laravel eloquent php-7
1个回答
0
投票

您不容易-其已加密!您将必须获取每条记录并将其解密,然后比较纯文本

这是解决问题的正确方法https://www.sitepoint.com/how-to-search-on-securely-encrypted-database-fields/

下面是我使用基于CRC的索引列的尝试

<?php

namespace App\ModelTraits;

use Illuminate\Support\Facades\Crypt;

/**
 * 
 */
trait EmailSigTrait
{

    public function setEmailAttribute($value)
    {
        $this->attributes['email'] = Crypt::encryptString($value);
        $this->attributes['emailsig'] = Self::crcemail($value);
    }

    public function getEmailAttribute()
    {
        if(!isset($this->attributes['email'])){
            return;
        }

        $value = $this->attributes['email'];

        if (empty($value)) {
            return;
        }

        return strtolower(Crypt::decryptString($value));
    }

    static function crcemail($email)
    {
        $email = strtolower($email);

        // anonymise the email
        $name = str_before($email,'@');

        $anon = substr($name, 0, 1) .
                substr($name, strlen($name)/2,1) .
                substr($name, -1) .
                '@' . str_after($email, '@');

        return sprintf(crc32(strToLower($anon)));
    }

    protected function findByEmailSig($email, $model)
    {
        $email = strtolower($email);

        $candidates = $model::where('emailsig', $model::crcemail($email))->get();

        foreach ($candidates as $candidate) {
            if (strtolower($candidate->email) == $email) {
                return $candidate;
            }
        }
        return false;
    }

}

将此特征包括在具有加密电子邮件地址的模型中。

为“电子邮件签名”添加文本列

保存电子邮件字段时,将为部分电子邮件地址创建一个crc值,并且电子邮件已加密。

检索电子邮件时被解密

[查找电子邮件时,它将计算CRC以供用户查找,然后将其与为每个电子邮件地址存储的CRC值进行比较。因为可能存在多个匹配项(多个具有相同CRC值的电子邮件),所以它会迭代可能的选择,直到找到正确的电子邮件为止。

取决于您今天对电子邮件进行加密的方式,您可能需要适应各种情况。

© www.soinside.com 2019 - 2024. All rights reserved.