mysql aes_decrpyt返回错误的值

时间:2014-08-21 11:43:48

标签: mysql encryption aes

在XAMPP测试环境中使用phpmyadmin中的以下查询:

SELECT AES_DECRYPT(AES_ENCRYPT('password1','secret'),'secret');

(见MySQL Encryption-Decryption Example AES DECRYPT

此查询应该返回密码1 ,但实际上它返回 70617373776f726431

有关原因的任何建议吗?


数据库服务器

服务器:127.0.0.1通过TCP / IP 服务器类型:MySQL 服务器版本:5.6.16 - MySQL社区服务器(GPL) 协议版本:10 用户: 服务器字符集:UTF-8 Unicode(utf8)

网络服务器

Apache / 2.4.9(Win32)OpenSSL / 1.0.1g PHP / 5.5.11 数据库客户端版本:libmysql - mysqlnd 5.0.11-dev - 20120503 - $ Id:bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $ PHP扩展:mysqli

1 个答案:

答案 0 :(得分:3)

看起来phpMyAdmin正试图成为有用的。"

70617373776f726431是"密码1"十六进制。

当您通过AES_DECRYPT(AES_ENCRYPT())传递数据时,字符集信息会丢失,因此MySQL认为结果是"二进制"而不是字符数据。我怀疑phpMyAdmin正在做出关于如何向您显示这些数据的错误假设。

在代码中使用,这可能会完全正常工作,因为您的代码可能不正确地尝试将其转换为十六进制以供您查看。这就是为什么,当你得到意想不到的东西,并且你没有使用mysql命令行客户端时,你应该总是使用官方CLI仔细检查以查看真的正在发生。

mysql> SELECT AES_DECRYPT( AES_ENCRYPT('password1','secret'),'secret');
+----------------------------------------------------------+
| AES_DECRYPT( AES_ENCRYPT('password1','secret'),'secret') |
+----------------------------------------------------------+
| password1                                                |
+----------------------------------------------------------+
1 row in set (0.08 sec)

如果您cast输出回到字符数据,您可能会在phpMyAdmin中获得预期结果,但您不应该在实际应用中执行此操作。

SELECT CAST(AES_DECRYPT(AES_ENCRYPT('password1','secret'),'secret') AS CHAR);

当然,作为一项规则,你不应该加密密码,你应该哈希它们。您应该只加密您需要能够解密的数据,并且使用密码,通常情况并非如此......并且您从未存储过的数据不会受到损害。