是否可以在 ECB 以外的模式(如 CBC)中使用 MySQL 的 AES_ENCRYPT 和 AES_DECRYPT 函数?Stack Overflow 上的各种问题都讨论了 MySQL 如何使用 ECB 模式以及不使用这些功能。我最好用我正在使用的编程语言进行加密/解密吗?
3 回答
不,这对于 SQL 查找来说是有问题的。ECB 模式对数据库很有用,因为它没有 IV,并且存在 1:1 的密文:明文关系。
select * from users where secret=aes_encrypt("some secret")
如果您在 CBC 模式下使用 IV,则必须遍历每条记录。这就是选择欧洲央行模式的原因。尽管普遍认为 ECB 模式并不总是一个问题,而且 CBC 模式通常会引入使用解密预言机进行 CBC-R 攻击的可能性。
使用 MySQL 5.6,您甚至可以设置会话加密:
SET @@session.block_encryption_mode = 'aes-256-cbc';
然后,您可以将列更新为加密:
UPDATE TABLE SET COLUMN = AES_ENCRYPT(MSISDN, 'password', 'encryptionkey');
解密:
SELECT CAST(aes_decrypt(COLUMN,'password','encryptionkey') AS CHAR) AS 'Encrypted COLUMN' FROM TABLE
请记住,对于此加密,您的密钥必须包含 16 个字符。
2014 年 4 月 28 日更新:
看起来 MySQL 5.7.4 支持更大的密钥大小和不同的操作模式。这也被向后移植到 5.6.17。密钥大小现在可以是 128、192 或 256。如果底层库是 OpenSSL,则模式可以是 ECB、CBC、CFB1、CFB8、CFB128 或 OFB。yaSSL 只允许 ECB 或 CBC。
见这里http://mysqlserverteam.com/understand-and-satisfy-your-aes-encryption-needs-with-5-6-17/
这里http://mysqlserverteam.com/the-mysql-5-7-4-milestone-release-is-available/
这里http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_block_encryption_mode
在这里https://twitter.com/morgo/statuses/459820794731065344(morgo 是 Oracle 的 MySQL 社区经理)