Получить зашифрованные данные, используя предложение where - PullRequest
0 голосов
/ 12 октября 2019

Вся моя база данных зашифрована, кроме первичного ключа (id). Мне нужно получить электронную почту, используя переменную $ email.

$encrypted=registermodel::select('email')->where('email','=',$email)->get();

1 Ответ

0 голосов
/ 12 октября 2019

Вы не можете легко - это зашифровано! Вам нужно было бы извлечь каждую запись, расшифровать ее и затем сравнить открытый текст

. Это правильный способ решения проблемы https://www.sitepoint.com/how-to-search-on-securely-encrypted-database-fields/

Ниже приведена моя попытка использования столбца индекса на основе CRC * 1006. *

<?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;
    }

}

Включите эту черту в модель с зашифрованным адресом электронной почты.

Добавьте текстовый столбец для 'emailsig'

При сохранении поля электронной почты значение crcсоздается для частей адреса электронной почты, а электронная почта зашифрована.

При получении электронной почты она расшифровывается

При нахождении электронной почты она рассчитывает CRC для поиска пользователем, а затем сравнивает, чтосо значением CRC, сохраненным для каждого адреса электронной почты. Поскольку может быть несколько совпадений (более одного электронного письма с одним и тем же значением CRC), он будет перебирать возможные варианты, пока не найдет правильное электронное письмо.

В зависимости от того, как вы шифруете электронную почту сегодня, вы можетедолжны адаптироваться, чтобы соответствовать.

...