前言
- 在数据安全性和查询效率之间找到平衡是许多数据管理系统所面临的挑战之一。特别是在涉及加密数据的情况下,如何进行模糊查询变得更加复杂。在本文中,我们将探讨三种不同进阶方法:沙雕、常规和超神做法。
沙雕方案
内存加载解密
- 将所有数据加载到内存中进行解密,然后通过程序算法来模糊匹配。这种做法效率低下,且不安全,因为涉及将所有数据加载到内存中,存在内存溢出和数据泄露的风险。
- 一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间,用DES来举例,
13800138000
加密后的串HE9T75xNx6c5yLmS5l4r6Q==
占24个字节:
密文映射表
- 将密文数据映射一份明文映射表,然后通过模糊查询明文映射表来关联密文数据。这种方法会暴露明文映射表,导致数据安全性降低。
- 我们本质是为了数据安全才进行加密,这种方案属实是掩耳盗铃,多此一举。
常规做法
实现数据库加密算法
- 在数据库底层实现数据加解密算法,在模糊查询的时候使用
decode(key) like '%partial%
进行查询。 - 本方案看着不错,但是存在一个很大的问题,就是通用性不强,在使用多种类型数据库时,函数需要重新定义,且使用的方式也不一定兼容,可拓展性、可移植性较差。
参考
MySQL
自定义函数:https://zhuanlan.zhihu.com/p/128744140
分词组合加密
- 对密文数据进行分词组合,然后将分词组合的结果集分别进行加密,存储到扩展列中。查询时通过解密函数进行模糊匹配。这种方法在保证数据安全性的同时,也保证了查询的效率。
- 但是我们都知道数据加密后长度会变长,出于成本、性能、安全的考虑,模糊查询的子句一般限制为:
子句长度必须大于等于4个英文/数字,或者2个汉字
- 比如国内很多互联网大厂都是使用类似的方案:
- 阿里密文字段检索方案:https://jaq-doc.alibaba.com/docs/doc.htm?treeId=1&articleId=106213&docType=1#s1
- 淘宝密文字段检索方案:https://open.taobao.com/docV3.htm?docId=106213&docType=1
超神方案
- 除上面提到的方案之外,我们还可以从算法层面设计一种加密算法来支持直接进行模糊匹配,但是整体设计难度、成本都过于复杂,一般实践中基本不会考虑这种方案。
- 下面是一些参考资料,有兴趣的朋友可以看一下:
- 支持快速查询的数据库如何加密:https://www.jiamisoft.com/blog/5961-kuaisuchaxunshujukujiami.html
- 基于Lucene的云端搜索与密文基础上的模糊查询:https://www.cnblogs.com/arthurqin/p/6307153.html
总结
- 通过本文的介绍和示例,我们可以更好地理解不同方法在加密数据的模糊查询中的应用和实现方式。选择合适的方法取决于数据安全性、查询效率和实现难度等因素的综合考量。
个人简介