我使用这种技术来隐藏我的数据库的某些字段:
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进行搜索,但我找不到解决方案。
有请求堆栈吗?但这不是很优化......
我是任何解决方案和任何意见的接受者!
答案 0 :(得分:1)
WHERE子句中不允许使用列别名。但是你可以在HAVING子句中使用它们:
SELECT CAST(AES_DECRYPT(message, '123456') AS CHAR(50)) decrypt
FROM messages
HAVING decrypt LIKE '%Lorem%'
您也可以复制完整的表达式并在WHERE子句中使用它(如评论中建议的Bernd Buffen):
SELECT CAST(AES_DECRYPT(message, '123456') AS CHAR(50)) decrypt
FROM messages
HAVING CAST(AES_DECRYPT(message, '123456') AS CHAR(50)) LIKE '%Lorem%'
但是我没有看到代码重复的原因。性能应该相同,因为表扫描将以任何一种方式执行。