Пожалуйста, будьте терпеливы, я не эксперт по криптографии. Мой вопрос, вероятно, очень простой, но я много гуглил и все еще в замешательстве.
В проекте 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? Спасибо!
Самый простой способ — использовать функцию шифрования / дешифрования mysql и выполнять оба действия «на лету».
Чтобы вставить и зашифровать данные:
insert into mytable (secret) values AES_ENCRYPT('SomeTextToHide','myPassword');
Для поиска зашифрованных значений с помощью like
select * from mytable where AES_DECRYPT(secret,'myPassword') like '%text%';
Целью возможности использования предложения 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%'
...
Если вы надежно зашифруете данные в базе данных, то вам нужно будет вытащить ВСЕ эти данные обратно на локальный, расшифровать все, а затем выполнить поиск с использованием подстановочного знака для расшифрованных данных.