目录
前言
这道题在面试比较常见,但是在算法逻辑层面中,直接对加密数据进行模糊查询是不可行的,因为加密算法会使数据变成不可读的形式
需要在加密过程中采取特殊的策略来支持模糊查询
以下只是结合网上现有的资料提供一个思路
(通过自定义一些规则还有说明,达到模糊查询,以此正确配对)
1. 基本知识
一、加密算法的限制:
加密后的数据是不可读的,所以不能直接进行模糊查询
对称加密和非对称加密的加密数据无法直接支持模糊查询
二、加密数据的模糊查询解决方案:
- 可搜索加密:一种加密方法,允许在加密数据上进行搜索操作
对称可搜索加密:在对称加密的基础上支持模糊查询,如通过加密关键词索引
同态加密:允许在加密数据上执行某些操作,例如加法和乘法,但对模糊查询支持有限
功能性加密:允许在加密数据上执行特定功能,如查询某些属性的加密数据 - 加密索引:建立加密的索引结构,用于加速模糊查询
例如,基于 Bloom Filter 或其他数据结构来实现加密后的索引查询
2. 国内做法
淘宝密文检索方案:https://open.taobao.com/docV3.htm?docId=106213&docType=1
拼多多密文检索方案:https://open.pinduoduo.com/application/document/browse?idStr=7553D76C8D1713EF
先通过市面环境查看,发现大多数都差不多,都是通过
- 对字段进行分段加密以支持模糊查询。将字段拆分成多个部分进行加密
例:对字符串“taobao123”进行4字符为一组的加密,生成多个加密部分,如“taob”、“aoba”、“obao”等 - 支持的查询条件:英文/数字至少4字符,中文至少2个字符
- 查询时,通过
key like “%partial%”
的方式进行模糊查询
基本的加密场景也差不多
- 普通加密方式:
适用于手机号之外的字段
对手机号支持前3位的模糊查询 - 支持模糊查询的加密方式:
适用于手机号之外的字段
对手机号支持后4位的模糊查询