如何使用AES_DECRYPT在大表中搜索?

时间:2014-05-21 08:17:23

标签: mysql

我使用 AES_DECRYPT 将敏感数据存储在mysql表中。现在桌子大约是50 Mb。

我有一个网页界面(带有php),访问者可以在其中搜索数据。我进行了一次LIKE搜索:

SELECT AES_DECRYPT(content,'salt') FROM table
WHERE CONVERT(AES_DECRYPT(content,'salt') USING utf8) LIKE '%search%'

它工作正常,但它变得非常慢。您是否有任何想法如何结合良好的安全性和良好的搜索功能?

1 个答案:

答案 0 :(得分:1)

MySQL无法有效地搜索包含在函数中的列。人们无法在MySQL中创建函数评估索引,就像PostgreSQL一样。

由于必须将解密内容所需的密钥提供给MySQL以进行此类查询,因此我没有看到为什么数据库服务器应该加密内容的原因。从安全角度来看,AES加密在此阶段是无用的。关键在于过程的记忆,因此理论上数据不再安全。 (如果攻击者可以接管进程的内存,则他的密钥和数据=>不安全)。

如果遵循这个观点,以这种方式使用MySQL的AES函数是没有意义的。如果你想以这种方式继续,你必须在某处保存未加密的数据,以便MySQL能够为它编制索引。

为了保护数据免受外人的侵害,可能需要加密MySQL的存储。通过设置加密卷并将MySQL的数据目录移动到此位置,可以(或多或少)轻松实现这一点。 (例如,请参阅此Ubuntu Tutorial for encrypted filesystems。)出于性能原因,只应移动包含敏感信息的文件。

这是一个更简单的解决方案,但存在一些性能和管理风险。在服务器故障上有a question,您可能想要阅读这些答案。