Как зашифровать данные, чтобы выполнять запросы SQL с LIKE?

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

В проекте PHP мне нужно зашифровать / расшифровать данные, сохраненные в базе данных. В предыдущем проекте я использовал шифрование aes128, и все прошло хорошо. Но сейчас у меня другая потребность. Мне нужно выполнять запросы в базе данных с помощью оператора LIKE. И, очевидно, шифрование части строки не входит в шифрование всей строки.

Погуглив, я понял, что, возможно, мне придется использовать алгоритм симметричного ключа (например, шифр Цезаря). Но я сделал тест с библиотекой php-encryption (https://github.com/defuse/php-encryption) и я получил следующий результат:

МАММА = ÿŸNq !! 83 = S ™ ÷ á; Bª¯‚οØ š ‹æ% §0%? _ † Ÿ&0c-âÐÜÉ /: LSçï; Õμå¬ £ §.öÒ9

МАММАМИЯ = (Ò Î {yG: [&¶ ›J’Õ6 ÷ ííG £ V {ÉsÙ = qÝ ×.: ÍÔ j… Qž¹ × j¶óóþ¡ÔnÛŠ * ån \ hhN

Шифрование первого слова не входит в шифрование второго. Очевидно, симметричный алгоритм не подходит для моих нужд.

Что я могу использовать для достижения своей цели с помощью PHP? Спасибо!

0

Решение

Самый простой способ — использовать функцию шифрования / дешифрования mysql и выполнять оба действия «на лету».

Чтобы вставить и зашифровать данные:

insert into mytable (secret) values AES_ENCRYPT('SomeTextToHide','myPassword');

Для поиска зашифрованных значений с помощью like

select * from mytable where AES_DECRYPT(secret,'myPassword') like '%text%';
1

Другие решения

Целью возможности использования предложения LIKE и его символов подстановки для надежно зашифрованных данных является набор из двух взаимоисключающих желаний.

Вы можете безопасно зашифровать свои данные, ИЛИ можете использовать предложение LIKE с подстановочными знаками. Вы не можете сделать оба сразу, потому что само предложение LIKE обойдёт шифрование!

SELECT * WHERE data LIKE 'a%'
SELECT * WHERE data LIKE 'b%'
...
SELECT * WHERE data LIKE '_a%'
SELECT * WHERE data LIKE '_b%'
...
SELECT * WHERE data LIKE '__a%'
SELECT * WHERE data LIKE '__b%'
...

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

0

По вопросам рекламы [email protected]