在mysql中使用AES_ENCRYPT和AES_DECRYPT搜索LIKE

问题描述 投票:2回答:2

我使用这种技术来隐藏我的数据库的某些字段: 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进行搜索,但我找不到解决方案。

有请求堆栈?但这不是很优化......

我是任何解决方案和任何意见的接受者!

mysql database encryption aes sql-like
2个回答
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%'

但是我没有看到代码重复的原因。性能应该相同,因为表扫描将以任一方式执行。


0
投票

这不是答案。它只适用于@Paul Spiegel。

最大的区别是HAVING首先使用所有ROW创建一个结果集,然后使用HAVING子句过滤结果。所以Query将需要更多的内存来存储第一个结果。

如果使用WHERE子句,它也是一个完整的表扫描,但是mysql只将结果行放在结果集中。

看样品。我创建了一个只有1000行的表,并且每10行只有一个“LOREM”字符串。请参阅EXPLAIN中的“过滤”列。

mysql> select id,CAST(message AS CHAR(20)) from messages limit 10;
+----+---------------------------+
| id | CAST(message AS CHAR(20)) |
+----+---------------------------+
|  1 | Lorem ipsum dolor si      |
|  2 | XXXXX ipsum dolor si      |
|  3 | XXXXX ipsum dolor si      |
|  4 | XXXXX ipsum dolor si      |
|  5 | XXXXX ipsum dolor si      |
|  6 | XXXXX ipsum dolor si      |
|  7 | XXXXX ipsum dolor si      |
|  8 | XXXXX ipsum dolor si      |
|  9 | XXXXX ipsum dolor si      |
| 10 | XXXXX ipsum dolor si      |
+----+---------------------------+
10 rows in set, 10 warnings (0,00 sec)

mysql> EXPLAIN SELECT
    ->        message  decrypt
    -> FROM  messages
    -> HAVING decrypt LIKE '%LOREM%';
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | messages | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1000 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0,00 sec)

mysql>
mysql> EXPLAIN SELECT
    ->        message  decrypt
    -> FROM  messages
    -> WHERE message LIKE '%LOREM%';
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | messages | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1000 |    11.11 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0,00 sec)

mysql>
© www.soinside.com 2019 - 2024. All rights reserved.