Проблема с MySQL AES_DECRYPT

Я ищу способ зашифровать данные на своем пути в базу данных MySQL и расшифровать их на выходе. Кроме того, я хотел бы иметь возможность выполнять обычные SQL-запросы в этих полях, таких как поиск и сравнение, что мешает мне использовать чистое PHP-решение.

Это приводит меня к AES_ENCRYPT () и AES_DECRYPT (), которые могут быть дублированы в PHP с использованием MCRYPT.

Мне сложно с AES_DECRYPT, и я попробовал все предложения, которые я могу найти через поисковые запросы в Интернете.

Вот моя таблица:

CREATE TABLE IF NOT EXISTS `test_table` ( `id` int(6) NOT NULL, `secure_info` text NOT NULL, `encrypted_blob` blob NOT NULL, `encrypted` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Я выполняю эти запросы:

 INSERT INTO test_table (id, secure_info) VALUES (1,'Testing'); UPDATE test_table SET encrypted = AES_ENCRYPT(secure_info,'key') WHERE id=1 LIMIT 1; UPDATE test_table SET encrypted_blob = AES_ENCRYPT(secure_info,'key') WHERE id=1 LIMIT 1; SELECT *, AES_DECRYPT(encrypted,'key') as decrypted, AES_DECRYPT(encrypted_blob,'key') as decrypted_blob FROM test_table WHERE id=1; 

Я не могу получить первоначальное значение. 'decrypted' возвращает NULL, а 'decrypted_blob' возвращает 54657374696e67

Любые идеи или, может быть, лучшее решение?

Блокировка расшифровывается очень хорошо, «54657374696e67» – это «Тестирование», только с шестнадцатеричным кодированием. Вероятно, вы выполняете это с помощью инструмента, который отображает blobs в hex. Расшифровка текста не работает (и не должна).

Поля TEXT в MySQL подвержены преобразованию набора символов. Если вы подключаетесь к iso-8859, а таблица хранится в CP1252, скажем, тогда MySQL будет автоматически преобразовывать текст между двумя наборами символов. Это приведет к сбою зашифрованных данных, так как некоторые байты исходных данных 8859 будут преобразованы в эквиваленты 1252, которые имеют разные значения.

С другой стороны, поля BLOB передаются дословно без преобразования, поэтому расшифровка ошибок отсутствует.

AES_ENCRYPT возвращает двоичную строку, поэтому не используйте текстовый тип столбца.

Совет. Начните нумерацию первичного ключа с 1 , а не 0

Совет 2: Старайтесь не называть свои поля после ключевых слов MySQL. Это может привести к путанице и обычно требует ускорения с обратными окнами ( text является исключением).

http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html

Если вы используете AES_ENCRYPT для шифрования символьной строки, тогда AES_DECRYPT возвращает не строку символов, а массив System.Byte. Я использую следующий код, чтобы восстановить его в строке:

  Dim back As System.Byte() back = DirectCast(reader(x), System.Byte()) Dim s As String = "" For Each b As Byte In back s &= Chr(b) Next 

согласен с @ user187291

У меня была такая же проблема, и я выяснил опцию, установленную в моем phpmyadmin

Показать двоичное содержимое как HEX

когда я запускаю тот же запрос в командной строке mysql, он показывал мне правильный результат