MYSQL | AES 加密()/解密()
MYSQL | AES encrypt() / decrypt()
我需要以可解密的方式加密字符串。最好的方法是通过给定的密码来获得一点保护。安全性在这里并不那么重要。
到目前为止我选出了 AES_ENCRYPT() 但无法解密。
加密: SELECT AES_ENCRYPT('test', 'test')
输出: 87bd903885943be48a4e68ab63b0ec6a
解密: SELECT AES_DECRYPT('87bd903885943be48a4e68ab63b0ec6a', 'test')
输出: NULL
!
简单的问题:为什么我不能解密?在网上找不到任何相关信息。
如果解决方案变得太大(我喜欢简单),我也可以使用另一种加密方法。
非常感谢!
MySQL-客户端版本:5.5.41
您需要先将十六进制字符串转换为二进制数据:
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 中)
在MySqlWorkbench下有一个设置Edit/Preferences/SqlEditor/Sql执行,勾选
[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,"Open Value in Viewer",在二进制和文本选项卡之间切换,参见 "secret message"
有点痛苦,尽管我在这个答案的顶部提到过,但是哦,好吧。它当然在 mysql 客户端中工作正常,而不是 Workbench.
只是想我会分享那个,感受一下你对 其他 问题 的痛苦。有点 client/version 具体。
我需要以可解密的方式加密字符串。最好的方法是通过给定的密码来获得一点保护。安全性在这里并不那么重要。
到目前为止我选出了 AES_ENCRYPT() 但无法解密。
加密: SELECT AES_ENCRYPT('test', 'test')
输出: 87bd903885943be48a4e68ab63b0ec6a
解密: SELECT AES_DECRYPT('87bd903885943be48a4e68ab63b0ec6a', 'test')
输出: NULL
!
简单的问题:为什么我不能解密?在网上找不到任何相关信息。
如果解决方案变得太大(我喜欢简单),我也可以使用另一种加密方法。
非常感谢!
MySQL-客户端版本:5.5.41
您需要先将十六进制字符串转换为二进制数据:
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 中)
在MySqlWorkbench下有一个设置Edit/Preferences/SqlEditor/Sql执行,勾选
[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,"Open Value in Viewer",在二进制和文本选项卡之间切换,参见 "secret message"
有点痛苦,尽管我在这个答案的顶部提到过,但是哦,好吧。它当然在 mysql 客户端中工作正常,而不是 Workbench.
只是想我会分享那个,感受一下你对 其他 问题