【发布时间】:2018-08-05 01:48:15
【问题描述】:
我使用这种技术来加密我的数据库的某些字段:
How to use AES_ENCRYPT and AES_DECRYPT in mysql
效果很好,但我遇到了问题。
现在字段的内容是加密的,我不能用经典的方式做 LIKE !
我尝试对解密字段执行类似操作,但 sql 无法识别该字段!!
这是结构(非常简单):
CREATE TABLE `messages` (
`id` int(11) NOT NULL,
`message` varchar(250) NOT NULL,
`crypt_key` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `messages`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
插入:
INSERT into messages (message) VALUES (AES_ENCRYPT('Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. ', '123456'));
简单选择:
SELECT
CAST(AES_DECRYPT(message, '123456') AS CHAR(50)) decrypt
FROM messages
完美,一切正常!
现在,假设我想在“消息”字段中使用 LIKE 进行搜索:
SELECT
CAST(AES_DECRYPT(message, '123456') AS CHAR(50)) decrypt
FROM messages WHERE decrypt LIKE '%Lorem%'
我收到此错误:
Unknown 'decrypt' field in where clause
这个查询同样的错误:
SELECT
CAST(AES_DECRYPT(message, '123456') AS CHAR(50)) AS decrypt
FROM messages WHERE decrypt.message LIKE '%Lorem%'
原则上,我有消息加密,解密密钥和解密算法!应该可以在解密字段中通过 sql 搜索,但我找不到解决方案。
使用请求堆栈?但这不是很优化...
我接受任何解决方案和任何意见!
【问题讨论】:
-
尝试 HAVING 而不是 WHERE。您不能在 WHERE 子句中使用列别名。
-
哇!它工作得很好=)我会了解它
-
但是有很大的不同。如果您使用 HAVING,则孔结果将最终确定,然后使用您的 HAVING 进行过滤。您也可以像这样使用 WHERE 中的函数:SELECT CAST(AES_DECRYPT(message, '123456') AS CHAR(50)) AS decrypt FROM messages WHERE CAST(AES_DECRYPT(message, ' 123456') AS CHAR(50)) LIKE '%Lorem%'; 。但是以 % 开头的 Like 始终是 FULL TABLE SCAN
-
@BerndBuffen 性能完全相同,因为无论哪种方式都需要全表扫描。那么为什么要写两次相同的表达式呢?
-
MySQL 内部加密不是很好,对任何实际敏感的数据都没有好处。 MySQL 和各种服务器日志将记录加密前后的未加密数据,然后再次解密。您希望在数据到达 MySQL 引擎之前进行加密。
标签: mysql database encryption aes sql-like