mysql - 在 mysql 中使用 AES_ENCRYPT 和 AES_DECRYPT 搜索 LIKE

标签 mysql database encryption aes sql-like

我使用这种技术来加密我数据库的某些字段:
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%'

原则上,我有消息加密、解密 key 和解密算法!应该可以在解密字段中通过 sql 进行搜索,但我找不到解决方案。

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

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

最佳答案

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%'

但我看不出这里代码重复的原因。性能应该是相同的,因为表扫描将以任何一种方式执行。

关于mysql - 在 mysql 中使用 AES_ENCRYPT 和 AES_DECRYPT 搜索 LIKE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48974370/

相关文章:

sql - 如何在 QuestDB 中进行月度/季度聚合?

python - 我可以使用 python 默认库集加密电子邮件并解密吗?

mysql - 在 MySQL 中,我应该选择哪种排序规则?

php - 如何以文本形式显示数据库中的数据?

mysql - 连接四个表

php - Mysql 从文件恢复

java - 使用 SQLiteAssetHelper 写入数据库

ios - 在 KeyChain Access 中存储加密/解密 key 的可靠性?

c# - 加密 web.config 文件中的 <appSettings> 标签

php - 尝试按 ASC 顺序获取结果但收到错误