如何使用MySQL aes_encrypt和aes_decrypt?

时间:2014-12-10 15:40:49

标签: mysql security aes

在我开始在我的应用中使用它之前,我只是在测试MySQL AES_ENCRYPT()AES_DECRYPT()。所以我写了一个简单的查询来测试它:

SELECT AES_DECRYPT(AES_ENCRYPT('SERV92','TESTTTTTTT'),'TESTTTTTTT') AS `TEST`

我收到错误,因为AES_ENCRYPT()中的参数很少 我做了一些研究,发现我的MySQL版本(5.6)确实需要额外的参数,所以我重写了查询

SELECT AES_DECRYPT(AES_ENCRYPT('SERV92','TESTTTTTTT',RANDOM_BYTES(16)),'TESTTTTTTT',RANDOM_BYTES(16)) AS `TEST`

结果:

+-----------+
|    TEST   |
|-----------|
|    NULL   |
+-----------+

重要的MySQL变量:

block encryption mode=aes-256-cbc

我正在尝试使用AES 256

2 个答案:

答案 0 :(得分:2)

你显然需要使用相同的init_vector第三个参数,因为它有效:

> set @a=RANDOM_BYTES(16);
> SELECT AES_DECRYPT(AES_ENCRYPT('SERV92','TESTTTTTTT',@a),'TESTTTTTTT',@a) AS `TEST`;
+--------+
| TEST   |
+--------+
| SERV92 |
+--------+

在您的情况下,您使用RANDOM_BYTES(16)两次,以便在加密和解密时使用不同的值。

答案 1 :(得分:1)

好的,我发现了问题,AES_DECRYPT()将数据作为blob返回。基本上我只需要告诉它它是utf8文本,如下所示。

SET @a=RANDOM_BYTES(16); #Thanks Hartmut Holzgraefe
SELECT CONVERT(AES_DECRYPT(AES_ENCRYPT('SERV92','TESTTTTTTT',@a),'TESTTTTTTT',@a) USING utf8) AS `TEST`
+----------+
|   TEST   |
+----------+
|  SERV92  |
+----------+
相关问题