如何使用MySQL aes_加密和aes_解密?
在我开始在我的应用程序中使用MySQL之前,我只是在测试MySQL如何使用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
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编码。