【问题标题】:MYSQL | AES encrypt() / decrypt()MYSQL | AES 加密()/解密()
【发布时间】:2015-08-06 08:07:17
【问题描述】:

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

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

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

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

简单的问题:为什么我不能解密它?在网上找不到任何关于它的信息。

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

非常感谢!


MySQL 客户端版本:5.5.41

【问题讨论】:

    标签: mysql encryption cryptography aes


    【解决方案1】:

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

    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分钟内接受)。
    • 可能是因为不同的mysql版本? stackoverflow.com/questions/31847954/… 这里有一个人在我得到文本的地方得到了 BLOB。 (还有不同的版本)。
    • 如果您不介意,请查看我的其他加密问题:stackoverflow.com/questions/31847954/…
    【解决方案2】:

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

    然后重新启动工作台。

    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 中运行良好。

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

    【讨论】:

    • 哦,感谢您的关注。我一定会检查一下。根据我的另一个:比我想象的要简单。刚刚被回答。 :)
    猜你喜欢
    • 2012-02-24
    • 2016-09-22
    • 2018-10-03
    • 2015-01-20
    • 2014-01-05
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多