数据加密后数据的密文状态是乱序的,会导致针对数据库字段的模糊查询功能失效,因此
需要一种办法能够在对数据进行加密的同时保障模糊查询功能。
技术方向1: 菜鸟做法(不可用)
将所有数据加载到内存中进行解密,解密后通过程序算法来模糊匹配将密文数据映射一份明文映射表,俗称tag表,然后模糊查询tag来关联密文数据。
思路1: 将所有数据加载到内存中进行解密,这个如果数据量小的话可以使用这个方式来做,这样做既简单又实惠,如果数据量大的话那就是灾难,我们来大致算一下。
思路2: 将密文数据映射一份明文映射表,然后模糊查询映射表来关联密文数据。增加一个明文的映射表就违背了安全诉求,这样做既不安全也不方便完全是脱裤子放x,多此一举,强且不推荐
技术方向2: 常规做法(很多互联网企业在用)
思路1: 在数据库中实现与程序一致的加解密算法,修改模糊查询条件,使用数据库加解密函数先解密再模糊查找,这样做的优点是实现成本低,开发使用成本低,只需要将以往的模糊查找稍微修改一下就可以实现。 相当于开发一个数据库插件,然后在数据库侧对加密字段解密后进行模糊匹配。
思路2: 对密文数据进行分词组合,将分词组合的结果集分别进行加密,然后存储到扩展列,查询时通过对多个扩展列的匹配进行模糊查询。
思路3: 新增一个扩展字段(将需要进行模糊查询的字段里面的每个字符逐次使用摘要算法进行单字符加密,容纳后拼接,存储到扩展字段)目前这个方法很多数据库加密代理网关厂商在用,
但是存在一个致命的问题是,扩展字段存储的是 每个字符做摘要后的的拼接值;也就是说在存储明文加密字段 的基础上,还有存储明文的每个字符的摘要结果哈希值的拼接,这个数据量增长是非常快的(密文比明文长很多)。
以下是该方法的详细步骤:
1. **获取待加密数据**:
- 待加密数据包括待加密字段和对应的明文字段值。
- 待加密字段中包含预设的模糊查询字段。
2. **单字符摘要加密**:
- 使用预设的单字符摘要加密算法,将各个模糊查询字段的明文字段值进行单字符加密,并进行拼接。
- 得到模糊查询字段的单字符密文字段值。
3. **生成扩展字段**:
- 为每个模糊查询字段生成一个扩展字段。
- 将单字符密文字段值存储至对应的扩展字段中。
4. **获取目标查询语句**:
- 目标查询语句包括目标模糊查询字段的扩展字段以及目标密文查询值。
- 目标密文查询值至少包含一个单字符密文。
5. **密文查询**:
- 基于目标密文查询值中的各个单字符密文,查询目标模糊查询字段的扩展字段。
- 得到密文查询结果,该结果包括多个至少命中一个单字符密文的目标模糊查询字段的单字符密文字段值。
6. **解密查询结果**:
- 解密密文查询结果,得到明文查询结果。
7. **加密待加密数据**:
- 将待加密数据中的待加密字段对应的明文字段值采用单字符摘要加密方法加密。
- 为每一个模糊查询字段增加一个扩展字段,将单字符密文字段值存储在扩展字段中。
8. **模糊检索**:
- 在模糊检索时,利用目标查询语句中的目标密文查询值查询扩展字段。
- 由于目标密文查询值包括单字符密文,因此可以实现对加密数据的模糊查询功能。
技术方向3:创新做法
设计一个有序的、不可逆的、密文长度不能增长过快的方法,使用译码或加密的方式进行加解密保留密文和原文一样的顺序,从而支持密文模糊匹配。
思路1: 利用同态加密技术去解决这个问题。