MySQL数据库中加密数据的通配符搜索?

7
我正在构建一个小型Web应用程序,每个插入的人将保存约10条信息。由于数据保护,其中大部分信息必须加密。
使用CodeIgniter框架和CodeIgniter加密类,我可以在应用程序端对信息进行编码,然后再将其存储到数据库中。CodeIgniter加密类使用PHP的mcrypt函数和AES_256密码。
我的问题是,我需要允许应用程序的用户使用通配符搜索存储的信息,可能还可以通过API进行搜索。
是否有人遇到过类似问题的解决方案?我已经了解了MySQL AES_ENCRYPT和AES_DECRYPT,但它们仍然需要在明文中传递密钥,这让我很不愿意。
目前我得出的结论是,如果我希望继续这个路线,那么每次进行搜索时,完整的表解密是唯一的解决方案(显然不好)。
1个回答

6

好的,确实无法在未解密的文本中进行搜索,这是事实。

然而,这并不意味着没有绕过这个问题的方法。例如,您可以创建一个数据的倒排索引并对用于搜索的键进行哈希(使用sha1、md5、crc32之一)。然后您只需哈希正在使用的搜索词,查找它们在索引中的位置,并检索与之匹配的任何记录,这只会占表的一小部分而非整个表。

通过哈希数据(使用盐!),您避免了以不安全的方式存储数据,同时仍然可以搜索数据,因为您已经为其创建了索引。只有在确定哪些文档匹配时才需要解密。


1
+1 鼓励侧重思维以及使用哈希技术以确保敏感关键字的保密性。 - Mark Baker
1
嗨,感谢您的回复。我想我理解了您的建议,但是当尝试进行“where_in”或“like”搜索时,索引仍然不会出现问题,例如:搜索%CHR%将返回一个包含单词CHRIS的记录。也许我理解有误,如果是这样,请您详细说明一下。 - user1530205
1
正确的是,通配符搜索在倒排索引中并不真正起作用,但在普通搜索中非常有效。你唯一能做通配符搜索的方法就是解密整个内容。 - Tom van der Woerdt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接