mysql aes_encrypt в столбец длинного текста - PullRequest
3 голосов
/ 14 апреля 2011

Можно ли сохранить MySQL AES_ENCRYPT в столбце LONGTEXT?

Я знаю, что предположим, для использования varbinary или blob, но у меня есть таблица, которую я хранюкуча случайных «настроек», и столбец settings_value - longtext.

Я пошел туда, чтобы сохранить «пароль почты smtp», и немного застрял.

Если нет,Я думаю, я сохраню это как шестнадцатеричную строку через php.

РЕШЕНИЕ:

Мой запрос был примерно таким:

INSERT INTO table (setting_value)VALUES(AES_ENCRYPT('password', 'key')) ON DUPLICATE KEY UPDATE setting_value=VALUES(setting_value)

Как вы увидите в моих комментариях ниже, я попытался изменить кодировку столбца с utf8_unicode_ci на utf8_bin, и все же это не удалось.Я изменил на latin1_bin, и он сработал.

Я переключился обратно на utf8_unicode_ci и изменил свой запрос на следующий:

INSERT INTO table (setting_value)VALUES(HEX(AES_ENCRYPT('password', 'key'))) ON DUPLICATE KEY UPDATE setting_value=VALUES(setting_value)

Это сработало, поскольку оно просто превратило мое значение в шестнадцатеричную строку.

Мне потребовалась секунда, чтобы понять, как правильно вернуть значение, поэтому для целей документации:

$pass = SELECT AES_DECRYPT(BINARY(UNHEX(setting_value)), 'key') as orig_text FROM table
echo $pass->orig_text

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Вы пробовали это? Настроить тестовый пример довольно легко, и, насколько я вижу, он отлично подходит для ваших требований:

mysql> create table t (id int unsigned not null auto_increment primary key, str LONGTEXT);
Query OK, 0 rows affected (0.13 sec)

mysql> desc t;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| str   | longtext         | YES  |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.05 sec)

mysql> 
mysql> INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
Query OK, 1 row affected (0.02 sec)

mysql> 
mysql> select id,str,AES_DECRYPT(str,'password') from t;
+----+-----------------------------+-----------------------------+
| id | str                         | AES_DECRYPT(str,'password') |
+----+-----------------------------+-----------------------------+
|  1 | ö½¨Ü·øÍJ/ª¼Tf€D            | text                        |
+----+-----------------------------+-----------------------------+
1 row in set (0.00 sec)
0 голосов
/ 06 августа 2013

Используйте некоторый двоичный тип столбца (например, BLOB вместо LONGTEXT) для хранения содержимого AES_ENCRYPTed.

...