【问题标题】:How to use MySQL aes_encrypt and aes_decrypt?如何使用 MySQL aes_encrypt 和 aes_decrypt?
【发布时间】:2014-12-10 15:40:49
【问题描述】:

我只是在开始在我的应用程序中使用 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

【问题讨论】:

  • 提示:您正在为 IV 获取 随机 个字节,但两个调用的字节应该相同。

标签: mysql security aes


【解决方案1】:

您显然需要使用与此相同的 init_vector 3rd 参数:

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

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

【讨论】:

  • 为什么我的结果会是534552563932
  • 嗯?能具体一点吗?
  • 是的,我最大的错误是没有使用相同的 16 个字节。基本上我复制并粘贴了您的查询,它为一列返回一条记录,该列是TESTTEST 下的一条记录的值是一个数字。为什么结果是数字而不是 'SERV92' 的字符串值?
  • hm ...所以出于某种奇怪的原因,您得到了一个十六进制字符串表示的 'SERV92' 返回 ('53'=S, 45=E ...) ... 奇怪,不知道为什么...
【解决方案2】:

好的,我找到了问题,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  |
+----------+

【讨论】:

  • 不幸的是,并非所有字节值也是有效的 UTF-8 编码。如果需要文本,则需要 base 64 编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 2020-09-03
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2011-06-20
相关资源
最近更新 更多