在我开始在我的应用中使用它之前,我只是在测试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
答案 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 |
+----------+