Я ищу способ зашифровать данные на своем пути в базу данных 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
является исключением).
Если вы используете 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, он показывал мне правильный результат