mysql aes_encrypt进入longtext列

时间:2011-04-13 20:00:08

标签: mysql aes

是否可以将MySQL AES_ENCRYPT存储到LONGTEXT列中?

我知道我假设使用varbinary或blob,但我有一个表,我正在存储一堆随机“设置”,而settings_value列是longtext。

我去那里存放了一个“smtp邮件密码”,并且有点卡住了。

如果没有,我想,我会通过php将它存储为十六进制字符串。

SOLUTION:

我的查询是这样的:

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 个答案:

答案 0 :(得分:2)

你尝试过吗?设置测试用例非常简单,从我看到它可以满足您的要求:

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)

答案 1 :(得分:0)

使用一些二进制列类型(如BLOB而不是LONGTEXT)来存储AES_ENCRYPTed内容。