Проблема с MySQL AES_DECRYPT - PullRequest
       3

Проблема с MySQL AES_DECRYPT

1 голос
/ 15 сентября 2010

Я ищу способ зашифровать данные по пути в базу данных 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

Есть идеи или, возможно, лучшее решение?

Ответы [ 5 ]

4 голосов
/ 15 сентября 2010

Расшифровка BLOB-объектов работает просто отлично, "54657374696e67" - это "Тестирование", только в шестнадцатеричном форматеВы, вероятно, выполняете это с помощью инструмента, который отображает капли в гексагоне.Расшифровка текста не работает (и не должна).

2 голосов
/ 16 сентября 2010

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

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

0 голосов
/ 10 февраля 2015

согласен с @ user187291

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

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

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

0 голосов
/ 20 марта 2013

Если вы используете 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
0 голосов
/ 15 сентября 2010

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

Совет: начинайте нумерацию первичных ключей с 1, а не 0

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...