Как реализовать поиск по зашифрованным полям базы данных - PullRequest
0 голосов
/ 12 ноября 2018

Iam Использование PHP и MySql для моего веб-приложения. У меня есть требование, когда мне нужно зашифровать информацию, относящуюся к пользователю, например, name & email_id.

$name = "Kevin John";
$encryptionMethod = "AES-256-CBC";
$secretHash = "25c6c7ff35b8879b151f2136cd13574";
$enc_name = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash);

Я храню это зашифрованное имя в моей базе данных. Но настоящая проблема заключается в том, что мне нужно искать пользователей по их имени. Например: -

$qry = "select * from users where name like %john%";

Любое предложение приветствуется

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

У вас может быть несколько вариантов, некоторые просто, а некоторые нет

  • поля поиска / ключа обычно хранятся в незашифрованном виде для решения этой проблемы (очевидно, вы этого не хотите)
  • как уже предлагалось - сканирование всей таблицы, расшифровка каждой записи будет работать, но может оказаться невозможным
    • Вы можете использовать статический IV для достижения детерминированного шифрования, шифровать искомый термин и искать уже зашифрованное значение. Зная, что статический IV снижает (а иногда и ломает) уровень безопасности
    • вы можете взглянуть на гомоморфное шифрование , специально разработанное для операций над зашифрованными данными, но не зная, что вы делаете, это может быть очень крутой и подверженный ошибкам путь для реализации собственной криптографии (не рекомендуется даже для опытные профессионалы). Я еще не смел пройти через эту дверь.
    • Вы можете хранить криптографические хеши (например, sha256) индексированных значений (возможно, зашифрованных значений). Тогда вы можете просто выполнить поиск по хешированному поисковому запросу, не имея возможности восстановить исходное значение
0 голосов
/ 13 ноября 2018

Используйте AES Encryption & Decryption в SQL для реализации поиска по зашифрованным полям БД. Синтаксис: -


AES_ENCRYPT ('Text_to_encrypt', 'secret_key')

AES_DECRYPT ('Text_to_decrypt', 'secret_key')


  • Сначала зашифруйте и сохраните данные в БД, используя AES Encryption в sql

    INSERT INTO User (fname,email,mobile) VALUES (AES_ENCRYPT('Arun gopan', 'Qwfe345dgfdg'), AES_ENCRYPT('arun123@fa.com', 'Qwfe345dgfdg'),'9658475577');


  • Теперь вы можете запрашивать БД, используя AES DECRYPT в sql для выполнения операций поиска.

    SELECT AES_DECRYPT(fname,'Qwfe345dgfdg'), AES_DECRYPT(email,'Qwfe345dgfdg') FROM User WHERE AES_DECRYPT(fname,'Qwfe345dgfdg') LIKE '%Arun%';

0 голосов
/ 12 ноября 2018

Не рекомендуется шифровать данные, по которым вы хотите искать.

  • Вы можете либо не шифровать поле, в котором хотите выполнить поиск.
  • или вы можете получить все данные, расшифровать и выполнить поиск, если строка содержит то, что вы хотите на уровне приложения (я бы не предложил этот подход).

    // Pseudocode
    $searchTerm = 'john';
    $allNamesQuery = 'select * from users'; 
    $allNamesData = execQuery($allNamesQuery);
    $suggestions = [];
    foreach($allNamesData as $row){
        $row = decryptNameFromRow($row);
        if(contains($row['name'], $searchTerm))
           array_push($suggestions, $row);
    }
    print_r($suggestions);
    

    Пожалуйста, предложите, если есть какие-либо альтернативы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...