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

3
我需要以可解密的方式加密一个字符串。最好的方法是通过给定的密码获得一点保护。在这里,安全性不是很重要。
我目前选择了AES_ENCRYPT(),但无法解密它。
加密:SELECT AES_ENCRYPT('test', 'test') 输出:87bd903885943be48a4e68ab63b0ec6a 解密:SELECT AES_DECRYPT('87bd903885943be48a4e68ab63b0ec6a', 'test') 输出:NULL
简单的问题:为什么我无法解密它?在网上找不到任何关于它的信息。
如果解决方案变得太复杂(我喜欢简单),我也可以接受其他加密方法。
非常感谢!
MySQL-客户端版本:5.5.41
2个回答

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版本中)

天啊,我已经看到这个unhex部分很多次了,但还没有找到使用它的地方。非常感谢,完美地解决了问题!(5分钟内接受)。 - C4d
也许是因为不同的mysql版本造成的?http://stackoverflow.com/questions/31847954/mysql-encode-outputs-blob-instead-of-text 在这里,一个人得到了BLOB,而我得到了Text(也是不同的版本)。 - C4d
如果您不介意的话,请查看我的另一个加密问题:http://stackoverflow.com/questions/31847954/mysql-encode-outputs-blob-instead-of-text - C4d

2
在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,选择“在查看器中打开值”,在二进制和文本选项卡之间切换,查看“秘密消息”。虽然我在回答顶部提到了这一点,但还是有些麻烦。当然,在mysql客户端中与Workbench相比,它可以正常工作。只是想分享一下,在你的其他问题中感受到你的痛苦。链接可能是特定于客户端/版本的。

哦,谢谢注意到了。我一定会检查的。关于我的另一个问题:比我想象的简单。已经有答案了。 :) - C4d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接