Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MySQL aes_加密和aes_解密?_Mysql_Security_Aes - Fatal编程技术网

如何使用MySQL aes_加密和aes_解密?

如何使用MySQL aes_加密和aes_解密?,mysql,security,aes,Mysql,Security,Aes,在我开始在我的应用程序中使用MySQL之前,我只是在测试MySQLAES\u ENCRYPT()和AES\u DECRYPT()。因此,我编写了一个简单的查询来测试它,如下所示: SELECT AES_DECRYPT(AES_ENCRYPT('SERV92','TESTTTTTTT'),'TESTTTTTTT') AS `TEST` 由于AES\u ENCRYPT() 我做了一些研究,发现我的MySQL版本(5.6)确实需要一个额外的参数,所以我重写了查询 SELECT AES_DECRYPT

在我开始在我的应用程序中使用MySQL之前,我只是在测试MySQL
AES\u ENCRYPT()
AES\u DECRYPT()
。因此,我编写了一个简单的查询来测试它,如下所示:

SELECT AES_DECRYPT(AES_ENCRYPT('SERV92','TESTTTTTTT'),'TESTTTTTTT') AS `TEST`
由于
AES\u 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,显然需要使用与此相同的
init_vector
3参数:

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

在您的例子中,您使用了两次随机字节(16),以便在加密和解密中使用不同的值。

好的,我发现了问题,
AES\u 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  |
+----------+

提示:您得到的是IV的随机字节,但两个调用的字节应该相同。为什么我的结果是
534552563932
嗯?你能更具体一点吗?是的,我最大的错误是没有使用相同的16字节。基本上,我复制并粘贴了您的查询,它为一列返回一条记录,该列为
TEST
,而
TEST
下的一条记录的值是一个数字。为什么结果是一个数字而不是“SERV92”的字符串值。。。因此,出于某种奇怪的原因,您得到了一个十六进制字符串形式的'SERV92'back('53'=S,45=E…)。。。奇怪,不知道为什么…不幸的是,并非所有字节值都是有效的UTF-8编码。如果需要文本,则需要base64编码。