我正在尝试将加密从Code迁移到数据库以加快速度。当我尝试使用此select语句解密信息时,我得到一个不正确的参数计数错误。
SELECT AES_DECRYPT(u.strFirstName,'usa2010') FROM EncryptingTest.tblUser u;
我查看了文档,这应该有效。有人能告诉我我做错了吗?
EDIT 我试过重启MySQL服务器无济于事。服务器版本为5.6.22
答案 0 :(得分:1)
从您提供的示例看来似乎没问题。你能看到先把它扔掉吗?
SELECT CAST(AES_DECRYPT(u.strFirstName,'usa2010') AS CHAR(50)) FROM EncryptingTest.tblUser u;
请查看此链接,它有关于您面临的问题的一些很好的资源......
http://mysqlblog.fivefarmers.com/2014/03/27/mysql-5-6-17-now-with-better-encryption/
编辑 - 实际修复
如果未提供IV,则将block_encryption_mode设置为除ECB以外的块密码的AES_ENCRYPT()或AES_DECRYPT()将产生错误:
mysql> SET @@session.block_encryption_mode = 'aes-256-cbc';
查询OK,0行受影响(0.00秒)
mysql> SELECT HEX(AES_ENCRYPT('test', 'key'));
ERROR 1582(42000):调用本机函数'aes_encrypt'时参数计数不正确 MySQL的> SELECT HEX(AES_ENCRYPT('test','key',RANDOM_BYTES(16))); + ------------------------------------------------- - + | HEX(AES_ENCRYPT('test','key',RANDOM_BYTES(16)))| + ------------------------------------------------- - + | 2EFBA8708925C1DF8B661E57938FAE5E | + ------------------------------------------------- - + 1排(0.00秒) 请注意,IV本身并不存储在生成的加密输出中 - 这是一个必须单独跟踪以获取解密值的工件:
mysql> SET @iv = RANDOM_BYTES(16);
查询OK,0行受影响(0.01秒)
mysql> SELECT HEX(AES_ENCRYPT('test', 'key', @iv));
+ -------------------------------------- + | HEX(AES_ENCRYPT('test','key',@ iv))| + -------------------------------------- + | 650CE9E699ECA922E09E80CEBE51BFC7 | + -------------------------------------- + 1行(0.00秒)
mysql> SELECT AES_DECRYPT(UNHEX('650CE9E699ECA922E09E80CEBE51BFC7'), 'key', @iv);
+ ---------------------------------------------- ---------------------- +
AES_DECRYPT(UNHEX('650CE9E699ECA922E09E80CEBE51BFC7'), 'key', @iv) |
+ ---------------------------------------------- ---------------------- + |测试| + ------------------------------------------------- ------------------- + 1行(0.00秒)