Intereting Posts
PHP: ошибка gethostbyname Простое имя учетной записи SPA, сохраненное как «root» вместо заданного имени пользователя Где я могу найти алгоритм, используемый для записи каждой встроенной функции PHP? Как реализовать класс bootstraping в фреймворке PHP? Проблема с сортировкой PHP с помощью simpleXML "Ошибка анализа: синтаксическая ошибка, неожиданный T_STRING" Значение с тем же именем в массиве как объединить json закодированные массивы, возвращенные из parallelcurl в PHP Как запускать несколько вызовов ajax на одной странице PHP: нравится / не нравится счетчик Флаги функций PHP, как? openssl_get_publickey () и завиток "невозможно использовать сертификат клиента" Легкий способ экспорта таблицы SQL без доступа к серверу или phpMyADMIN Как выводить данные регистрационной формы на текущую страницу и другую страницу? Должен ли я использовать многобайтную перегрузку (mbstring.func_overload)?

Шифровать с помощью PHP Mcrypt и расшифровывать с помощью MySQL aes_decrypt?

Можно ли mcrypt данные с помощью PHP mcrypt и расшифровать его в базе данных с помощью MySQL AES_DECRYPT ? На данный момент я использую mcrypt для mcrypt на PHP. Я также убедился, что зашифрованные поля в базе данных имеют тип данных blob . Тем не менее, AES_DECRYPT с правильным ключом все еще возвращает NULL . Любые предложения о том, как заставить это работать?

Я нашел хорошую помощь здесь

Обратите внимание, что это работает для зашифрованного текста до 65519 символов в текстовом формате. (может быть, немного больше, если нет кодировки UTF-8)

PHP-код для шифрования:

 // MySQL uses 16 bytes key for 128 encryption/decryption $key = "ABCDEF0123456789"; $plaintext = "This string was AES-128 / EBC / ZeroBytePadding encrypted."; // Optionally UTF-8 encode $plaintext_utf8 = utf8_encode($plaintext); // Find out what's your padding $pad_len = 16 - (strlen($plaintext_utf8) % 16); // Padd your text $plaintext_utf8 = str_pad($plaintext_utf8, (16 * (floor(strlen($plaintext_utf8) / 16) + 1)), chr($pad_len)); // Encryption mt_srand(); $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); mcrypt_generic_init($td, $key, false); // Generates a warning about empty IV but it's Ok $ciphertext = mcrypt_generic($td, $plaintext_utf8); mcrypt_generic_deinit($td); $ciphertext = mysql_real_escape_string($ciphertext); // Store in MySQL $mysqli = new mysqli("localhost", "test", "test", "test"); $mysqli->set_charset("utf8"); $mysqli->query("insert into test(content) value ('$ciphertext')"); $mysqli->close(); 

SQL-запрос для поиска string was :

 SELECT CAST(AES_DECRYPT(content,'ABCDEF0123456789') AS CHAR) AS content FROM test WHERE CAST(AES_DECRYPT(content,'ABCDEF0123456789') AS CHAR) like '%string was%'; 

Выход:

 This string was AES-128 / EBC / ZeroBytePadding encrypted. 

Примечание. Таблица MySQL была создана:

 create table test ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, content blob ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

Если вы шифруете с помощью mcrypt RIJNDAEL_128 на стороне PHP, я бы рекомендовал оставить дешифрование на стороне PHP. Я был под тем же вопросом не так давно, когда он пришел к идентификационным номерам учеников для одного из моих приложений. Я выбрал против того, чтобы база данных выполняла любое шифрование / дешифрование. Я настоятельно рекомендую оставить это только одной системе (в данном случае mcrypt). Причина в том, что теперь у вас меньше «движущихся» частей, которые могут пойти не так, что позволяет упростить обслуживание и облегчить документирование аудиторских маршрутов . Ваша база данных должна использоваться для хранения данных (не удивительно), поэтому просто убедитесь, что длина в базе данных подходит для того, что вы храните.

Надеюсь, это ответит на ваш вопрос / поможет вам каким-то образом, так как я это делаю / на самом деле делаю.

Теперь, если вам нужно увидеть какой-то код, как это будет работать, просто спросите. Из моего понимания, хотя я думаю, что вы знаете, как сделать шифрование / дешифрование, но вы просто спрашиваете, должна ли база данных расшифровывать информацию или нет.

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

Я бы предложил, чтобы вы посмотрели на старый драгоценный камень «фильтр цветения». Он обычно используется для проверки орфографии, но может использоваться для ускорения поиска в базах данных. https://en.wikipedia.org/wiki/Bloom_filter

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

Затем вы запускаете слово (строку) через эти хеширующие функции и добавляете эти биты в свой фильтр. Теперь фильтр «знает» ваше слово в нем.

Фильтр компактен, потому что слова могут перекрывать друг друга в фильтре.

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

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

Текст не может быть восстановлен из фильтра цветения.

Фильтр цветения никогда не может дать ложный отрицательный результат, но он может дать ложный результат . Если вы получаете ложные срабатывания, ваш фильтр слишком мал по сравнению с вашим набором данных (слова, хранящиеся в фильтре), или ваши хеширующие функции недостаточно хороши. Сколько функций хеширования вам нужно, зависит от размера данных, попробуйте 5-20.

Наконечник! Вы также можете добавить пары слов или триплетов слов в свой цветной фильтр.