MYSQL | AES加密()/解密()

时间:2015-08-06 08:07:17

标签: mysql encryption cryptography aes

我需要以可解密的方式加密字符串。最好的方法是使用给定的密码来获得一点保护。安全性在这里并不重要。

到目前为止,我选择了AES_ENCRYPT(),但无法对其进行解密。

加密: SELECT AES_ENCRYPT('test', 'test')
输出 87bd903885943be48a4e68ab63b0ec6a

解密: SELECT AES_DECRYPT('87bd903885943be48a4e68ab63b0ec6a', 'test')
输出 NULL

简单的问题:为什么地狱无法解密呢?无法在网上找到任何相关信息。

如果解决方案变得太大(我喜欢它很简单),我也可以使用另一种加密方法。

非常感谢!

MySQL-Client-Version:5.5.41

2 个答案:

答案 0 :(得分:2)

您需要先将十六进制字符串转换为二进制数据:

SELECT AES_DECRYPT(UNHEX('87bd903885943be48a4e68ab63b0ec6a'), 'test') FROM DUAL;

实际上,我很惊讶你原来的SELECT语句首先返回了一个十六进制字符串。这就是我得到的:

mysql> SELECT AES_ENCRYPT('test','test') FROM DUAL;
+----------------------------+
| AES_ENCRYPT('test','test') |
+----------------------------+
| ???8??;?Nh?c??j                     |
+----------------------------+
1 row in set (0.02 sec)

如果我明确地调用HEX(),我只能得到一个十六进制字符串:

mysql> SELECT HEX(AES_ENCRYPT('test','test')) FROM DUAL;
+----------------------------------+
| HEX(AES_ENCRYPT('test','test'))  |
+----------------------------------+
| 87BD903885943BE48A4E68AB63B0EC6A |
+----------------------------------+
1 row in set (0.00 sec)

(这是MySQL版本5.6.22)

答案 1 :(得分:1)

在MySql Workbench中,在Edit / Preferences / Sql Editor / Sql Execution下有一个设置复选框 [X] Treat BINARY/VARBINARY as nonbinary character string

然后重新启动Workbench。

SELECT HEX(AES_ENCRYPT('secret message','myKey')) into @a FROM DUAL;
select @a; -- 'F5CF7120FF800ECEB4663785EFC19340'

SELECT AES_DECRYPT(UNHEX('F5CF7120FF800ECEB4663785EFC19340'), 'myKey') FROM DUAL;
-- secret message  (shows it fine)

SELECT AES_DECRYPT(unhex(@a), 'wrongKey') from dual;
-- NULL  (at least it is a tip-off that it failed)
SELECT AES_DECRYPT(unhex(@a), 'myKey') from dual;
-- BLOB

现在右键单击BLOB,“在Viewer中打开值”,在二进制和文本选项卡之间切换,参见“秘密消息”

即使我在本答案的顶部提到了,但有点痛苦,但是哦。它当然在mysql客户端工作正常,而不是Workbench。

想到我会分享这一点,感受你对其他问题link的痛苦。客户端/版本特定的排序。