Почему функция расшифровки Измените все значения на Null? - PullRequest
0 голосов
/ 13 сентября 2018

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

Вот мой код

update TCB set Company=aes_encrypt(Company,'1234') WHERE Company= CONVERT(Company USING ASCII);
//I added where clause in case if there is any Encrypted data

select *,cast(aes_decrypt(Company,'1234') as char(100))  from TCB;

Заранее спасибо

1 Ответ

0 голосов
/ 13 сентября 2018

AES_ENCRYPT() возвращает двоичные байты, а не текст.Когда вы сохранили зашифрованные данные в том же столбце, который, как я полагаю, является столбцом varchar или text с набором символов, он попытался интерпретировать двоичные байты как кодировки в наборе символов столбца.Вполне вероятно, что многие байты не были допустимыми кодировками для этого набора символов, поэтому вы получили данные с мусором, которые не могут быть расшифрованы.

mysql> create table tcb ( company text );

mysql> insert into tcb set company = 'company';

mysql> update tcb set company = aes_encrypt(company, '1234');
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> show warnings;
+---------+------+----------------------------------------------------------------------------------+
| Level   | Code | Message                                                                          |
+---------+------+----------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\x8F\x94O\x1D\xB9\x07...' for column 'company' at row 1 |
+---------+------+----------------------------------------------------------------------------------+

Вы должны сохранить зашифрованные данные в столбец VARBINARY или BLOB.Эти типы данных не имеют набора символов, они просто хранят двоичные байты.

mysql> create table tcb (company text, company_enc blob);

mysql> insert into tcb set company = 'company';

mysql> update tcb set 
    company_enc = aes_encrypt(company, '1234'),
    company = NULL; /* no more plain text copy */

mysql> select aes_decrypt(company_enc, '1234') from tcb;
+----------------------------------+
| aes_decrypt(company_enc, '1234') |
+----------------------------------+
| company                          |
+----------------------------------+

Другим решением является хранение зашифрованных данных после преобразования двоичных байтов в печатаемую строку шестнадцатеричных цифр.

mysql> update tcb set company = 'company';

mysql> update tcb set company = hex(aes_encrypt(company, '1234'));

mysql> select company from tcb;
+----------------------------------+
| company                          |
+----------------------------------+
| 8F944F1DB907685B94F8F21554E57396 |
+----------------------------------+

mysql> select aes_decrypt(unhex(company), '1234') from tcb;
+-------------------------------------+
| aes_decrypt(unhex(company), '1234') |
+-------------------------------------+
| company                             |
+-------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...