网易首页 > 网易号 > 正文 申请入驻

加密后的敏感字段还能进行模糊查询吗?该如何实现?

0
分享至

前言

有一个问题不知道大家想过没?敏感字段数据是加密储备在数据库的表中,如果需要对这些敏感字段进行模模糊查询,还用原先的通过sql的where从句的like来模糊查询的方式肯定是不行的,那么应该怎么实现呢?这篇文章就来解决这个问题。

场景分析

假如有类似这样的一个场景:有一个人员治理的功能,人员信息列表的主要字段有姓名、性别、用户账号、手机号码、身份证号码、家庭住址、注册日期等,可以对任意一条数据进行增、删、改、查,其中姓名、身份证号码、手机号码字段要支持模糊查询。

简单分析一个场景,可以知道:手机号码、身份证号码、家庭人址字段数据是敏感数据,这些字段的数据是要加密储备在数据库里,在页面上展现的时候需要进行脱敏处理的。

如果用户要查询手机号码尾号是“0537”的用户,后台执行类似与姓名模糊查询的sql,"select * from sys_person where phone like '%0537'",肯定是得不到正确的结果的,因为手机号码字段在数据库中的数据是加密后的结果,而‘0537’是明文。身份证号码、家庭住址等其他敏感字段在模糊查询的时候也都有类似这样的问题,这也是敏感字段模糊查询的痛点,即模糊查询关键字与实际储备的数据不一致。

实现方案

下面分享几种解决方案:

第一种,先解密再查询

查询出目标表内所有的数据,在内存中对要模糊查询的敏感字段的加密数据进行解密,然后再遍历解密后的数据,与模糊查询关键字进行比较,挑选出包含有模糊查询关键字的数据行。

这种方法是最容易想到的,但有一个比较明显的问题是,模糊查询的过程是在内存中进行的,如果数据量特别大,很容易导致内存溢出,因此不推举在生产中使用这种方法;

第二种,明文映射表

新建一张映射表,储备敏感字段解密后的数据与目标表主键的映射表,需要模糊查询的时候,先对明文映射表进行模糊查询,得到符合条件的目标数据的主键,再返回来根据主键查询目标表;

这种方法,实际上是有点掩耳盗铃的感觉,敏感字段加密储备的字段主要是考虑到安全性,使用明文映射表来储备解密后的敏感字段,实际上相当于敏感字段没有加密储备,与最被要对敏感字段加密的初衷相违背,因此不推举在生产中使用这种方法;

第三种,数据库层面进行解密查询

后台在执行查询sql时对敏感字段先解密,然后再执行like,以上面的人员治理列表模糊查询为例,即对sql的改造为:“select * from sys_person where AES_DECRYPT(phone,'key') like '%0537'”;

这种方法的优点是,成本比较小,容易实现,但是缺点很明显,该字段无法通过数据库索引来优化查询,另外有一些数据库无法保证数据库的加解密算法与程序的加解密算法一致,可能会导致可以程序中加密,但是无法在数据库中解密的或者可以在数据库加密无法在程序中解密的问题,因此不推举在生产中使用这种方法;

第四种,分词密文映射表

这种方法是对第二种思路的基础上进行延伸优化,也是主流的方法。新建一张分词密文映射表,在敏感字段数据新增、修改的后,对敏感字段进行分词组合,如“15503770537”的分词组合有“155”、“0377”、“0537”等,再对每个分词进行加密,建立起敏感字段的分词密文与目标数据行主键的关联关系;在处理模糊查询的时候,对模糊查询关键字进行加密,用加密后的模糊查询关键字,对分词密文映射表进行like查询,得到目标数据行的主键,再以目标数据行的主键为条件返回目标表进行精确查询。

淘宝、阿里、拼多、京东等大厂对用户敏感数据加密后支持模糊查询都是这样的原理,下面是几个大厂的敏感字段模糊查询方案说明,有兴趣可以了解一下:

淘宝密文字段检索方案

https://open.taobao.com/docV3.htm?docId=106213&docType=1

阿里巴巴文字段检索方案

https://jaq-doc.alibaba.com/docs/doc.htm?treeId=1&articleId=106213&docType=1

拼多多密文字段检索方案

https://open.pinduoduo.com/application/document/browse?idStr=3407B605226E77F2

京东密文字段检索方案

https://jos.jd.com/commondoc?listId=345

这种方法的优点就是原理简单,实现起来也不复杂,但是有一定的局限性,算是一个对性能、业务相折中的一个方案,相比较之下,在能想的方法中,比较推举这种方法,但是要特别注意的是,对模糊查询的关键字的长度,要在业务层面进行限制;以手机号为例,可以要求对模糊查询的关键字是四位或者是五位,具体可以再根据具体的场景进行详细划分。

为什么要增加这样的限制呢?因为明文加密后长度为变长,有额外的储备成本和查询性能成本,分词组合越多,需要的储备空间以及所消耗的查询性能成本也就更大,并且分词越短,被硬破解的可能性也就越大,也会在一定程度上导致安全性降低;

环境配置

jdk版本:1.8开发工具:Intellij iDEA 2020.1

springboot:2.3.9.RELEASE

mybatis-spring-boot-starter:2.1.4

依靠配置

示例主要用到了SpringAop,加密是对称加密,用到了hutool工具包里的加密解密工具类,也可以使用自己封装的加密解密工具类。

org.springframework.bootspring-boot-starter-aopcn.hutoolhutool-all5.3.3

代码实现

1、新建分词密文映射表;

如果是多个模糊查询的字段,可以共用在一张分词密文映射表中扩展多个字段,以示例中的人员治理功能为例,新建sys_person_phone_encrypt表(人员的手机号码分词密文映射表),用于储备人员id与分词组合密文的映射关系

create table if not exists sys_person_phone_encrypt( id bigint auto_increment comment '主键' primary key, person_id int not null comment '关联人员信息表主键', phone_key varchar(500) not null comment '手机号码分词密文')comment '人员的手机号码分词密文映射表';

2、敏感字段数据在保存入库的时候,对敏感字段进行分词组合并加密码,储备在分词密文映射表;

在注册人员信息的时候,先取出通过AOP进行加密过的手机号码进行解密;手机号码解密之后,对手机号码按照连续四位进行分词组合,并对每一个手机号码的分词进行加密,最后把所有的加密后手机号码分词拼接成一个字符串,与人员id一起保存到人员的手机号码分词密文映射表;

public Person registe(Person person) {this.personDao.insert(person);String phone = this.decrypt(person.getPhoneNumber());String phoneKeywords = this.phoneKeywords(phone);this.personDao.insertPhoneKeyworkds(person.getId(),phoneKeywords);return person;}private String phoneKeywords(String phone) {String keywords = this.keywords(phone, 4);System.out.println(keywords.length());return keywords;} //分词组合加密private String keywords(String word, int len) {StringBuilder sb = new StringBuilder();for (int i = 0; i < word.length(); i++) {int start = i;int end = i + len;String sub1 = word.substring(start, end);sb.append(this.encrypt(sub1));if (end == word.length()) {break;}}return sb.toString();}public String encrypt(String val) {//这里特别注意一下,对称加密是根据密钥进行加密和解密的,加密和解密的密钥是相同的,一旦泄漏,就无秘密可言,//“fanfu-csdn”就是我自定义的密钥,这里仅作演示使用,实际业务中,这个密钥要以安全的方式储备;byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue(), "fanfu-csdn".getBytes()).getEncoded();SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.DES, key);String encryptValue = aes.encryptBase64(val);return encryptValue;}public String decrypt(String val) {//这里特别注意一下,对称加密是根据密钥进行加密和解密的,加密和解密的密钥是相同的,一旦泄漏,就无秘密可言,//“fanfu-csdn”就是我自定义的密钥,这里仅作演示使用,实际业务中,这个密钥要以安全的方式储备;byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue(), "fanfu-csdn".getBytes()).getEncoded();SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.DES, key);String encryptValue = aes.decryptStr(val);return encryptValue;}

3、模糊查询的时候,对模糊查询关键字进行加密,以加密后的关键字密文为查询条件,查询密文映射表,得到目标数据行的id,再以目标数据行id为查询条件,查询目标数据表;

根据手机号码的四位进行模糊查询的时候,以加密后模糊查询的关键字为条件,查询sys_person_phone_encrypt表(人员的手机号码分词密文映射表),得到人员信息id;再以人员信息id,查询人员信息表;

public List getPersonList(String phoneVal) {if (phoneVal != null) { return this.personDao.queryByPhoneEncrypt(this.encrypt(phoneVal));}return this.personDao.queryList(phoneVal);}

select * from sys_person where id in (select person_id from sys_person_phone_encrypt where phone_key like concat('%',#{phoneVal},'%'))

示例完整代码:

https://gitcode.net/fox9916/fanfu-web.git

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
杰伦-布朗:我们要将比赛当成生命的依赖一样去战斗

杰伦-布朗:我们要将比赛当成生命的依赖一样去战斗

直播吧
2024-06-17 02:05:06
枪手超市开业!低价甩卖4大球星 收入有望破亿

枪手超市开业!低价甩卖4大球星 收入有望破亿

球事百科吖
2024-06-15 20:42:16
杨丞琳被路人偶遇,身高一米6在人群中年轻又精致,太羡慕李荣浩

杨丞琳被路人偶遇,身高一米6在人群中年轻又精致,太羡慕李荣浩

顶牌故事会
2024-06-12 10:03:57
女生的那层膜,到底什么样?(高清图认识一下)

女生的那层膜,到底什么样?(高清图认识一下)

水白头
2024-06-17 00:35:02
中国给孟加拉国修了座桥,结果因修的太好了!惹得对方四处显摆

中国给孟加拉国修了座桥,结果因修的太好了!惹得对方四处显摆

简读视觉
2024-06-17 01:02:45
iPad Pro瘦身大获成功之后 苹果计划推出最薄iPhone 17和MacBook Pro设计

iPad Pro瘦身大获成功之后 苹果计划推出最薄iPhone 17和MacBook Pro设计

cnBeta.COM
2024-06-17 01:22:05
中国经济巨大成就的背后:有两个痛点,是什么痛点?

中国经济巨大成就的背后:有两个痛点,是什么痛点?

永不出场的戈多
2024-06-15 07:58:52
以色列将双面开战?和黎巴嫩真主党冲突升级,边境小村遭以袭击188次,800人逃离

以色列将双面开战?和黎巴嫩真主党冲突升级,边境小村遭以袭击188次,800人逃离

红星新闻
2024-06-16 18:33:09
疯传!女员工表白大20岁副行长,言语肉麻发错群,银行回应来了

疯传!女员工表白大20岁副行长,言语肉麻发错群,银行回应来了

懂瓜瓜
2024-06-15 20:12:37
俄媒:若没收俄资产,G7国家将损失约830亿美元

俄媒:若没收俄资产,G7国家将损失约830亿美元

参考消息
2024-06-16 09:57:08
17岁中专女生数学竞赛全球12名!我试着做了这套题,给跪了...

17岁中专女生数学竞赛全球12名!我试着做了这套题,给跪了...

毕导
2024-06-14 17:15:49
吕迪格回应定妆照争议手势:很多球员摆出这个姿势,没有宗教意涵

吕迪格回应定妆照争议手势:很多球员摆出这个姿势,没有宗教意涵

直播吧
2024-06-16 06:45:07
他是原中央政治局常委,连任三大省委书记,1969年被秘密处决

他是原中央政治局常委,连任三大省委书记,1969年被秘密处决

历史1949
2024-05-28 00:38:22
法国股市崩了,市值一周蒸发超万亿元!马克龙:正处于非常严峻时刻!财长:法国恐脱欧、陷金融危机

法国股市崩了,市值一周蒸发超万亿元!马克龙:正处于非常严峻时刻!财长:法国恐脱欧、陷金融危机

每日经济新闻
2024-06-16 10:12:06
这要是范佩西在荷兰半场14射靠折射进球,两大前锋屡失良机

这要是范佩西在荷兰半场14射靠折射进球,两大前锋屡失良机

直播吧
2024-06-16 22:00:34
皮耶罗与德国主持人开玩笑:我为自己在06年的进球感到抱歉

皮耶罗与德国主持人开玩笑:我为自己在06年的进球感到抱歉

懂球帝
2024-06-16 10:08:13
台媒爆料称,大S疑似在幕后操纵!让汪小菲与孩子共度父亲节

台媒爆料称,大S疑似在幕后操纵!让汪小菲与孩子共度父亲节

综艺拼盘汇
2024-06-16 23:56:04
当穷人有钱后能挥霍到什么程度?网友:我朋友天天洗脚 腰都快废了

当穷人有钱后能挥霍到什么程度?网友:我朋友天天洗脚 腰都快废了

开玩笑的水母
2024-06-14 11:18:21
17岁姜萍爆火后有人质疑作弊,网友:达摩院到校出题核实后公布的

17岁姜萍爆火后有人质疑作弊,网友:达摩院到校出题核实后公布的

一口娱乐
2024-06-16 22:07:35
瑞士和会第一天,泽连斯基吹嘘会议成就,与会各国政要却反响平平

瑞士和会第一天,泽连斯基吹嘘会议成就,与会各国政要却反响平平

叮当当科技
2024-06-16 23:44:42
2024-06-17 02:34:44
顽皮bb猪
顽皮bb猪
这也太可爱了吧
1410文章数 211关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

教育
本地
健康
数码
旅游

教育要闻

大家都知道,这题目不会特别容易,看来还得是稳打稳的刷题才行啊

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

晚餐不吃or吃七分饱,哪种更减肥?

数码要闻

PCIe 5.0 SSD终于要便宜了!群联E31T主控无缓存能跑12GB/s

旅游要闻

@毕业生,江苏这些景区可享免票或优惠

无障碍浏览 进入关怀版