密文字段模糊检索方案

代码地址: https://github.com/zuiyu-main/EncryptDemo

https://mp.weixin.qq.com/s/cXOg1tiMtJz2eibDZmXHUQ

在个别特殊领域中,数据的安全问题是非常的重要的,所以需要数据库存储的数据是需要加密存储的。所以也就引申出来本文这个问题,加密之后的密文,还能模糊检索吗,如果能检查,如何做模糊检索呢?

现在的系统设计中,常见的加密字段有、密码、身份证号、手机号、住址信息、银行卡、信用卡以及个别行业的敏感信息。这些信息对加密的要求也不一样,对于密码来说,一般使用不可逆的加密算法就可以,一般不会用到检索。但是对于身份证号或者个别领域中的中文信息,我们是需要支持密文模糊匹配的,下面我们就来看看有哪些实现方式。

本来主要讲两种常规的简单加密做法,主要目标为能实现密文的模糊查询。下面来跟我看第一种。

常规分词加密

常规加密的密文检索功能根据4位英文字符(半角)2个中文字符(全角)作为一个检索条件,将一个字段拆分为多个字段。

比如:zuiyu123

使用4个字符为一组的加密方式。

第一组 zuiy,第二组uiyu,第三组iyu1,第四组yu12,第五组u123…如果字符串很长,依次类推下去。

如果需要检索所有包含检索条件 uiyu 的数据,加密字符后通过 key like ‘%加密uiyu的密文%’查询。

所以这种实现方式就会有一种问题就是,随着加密字符串的增加,密文也会变的越大,所以一般用此处方式需要注意数据库中的字段长度限制

需要注意的是,使用此处方式有一定的限制:

1、支持模糊检索加密,但是加密的密文随原文长度增长

2、支持的模糊检索条件必须大于等于4个英文数字或者2个汉字,不支持短的查询(自定义该局限性,业界常用的就是4个英文数字或者2个汉字,再短的长度不建议支持,因为分词组合会增多从而导致存储的成本增加,反而安全性降低。)。

3、返回的列表不是很精确,需要二次筛选,先解密在进一步筛选。

字符串拆分的代码如下:

protected List<String> loopEncryptString(String input, int chunkSize) {int length = input.length();List<String> strList = new LinkedList<>();for (int i = 0; i < length; i++) {StringBuilder chunkBuilder = new StringBuilder();for (int j = 0; j < chunkSize; j++) {int index = (i + j) % length;chunkBuilder.append(input.charAt(index));}strList.add(chunkBuilder.toString());log.info("第 {} 组:[{}]",i+1,chunkBuilder);// 如果到了最后一个分组,则不再循环第一个字符if (i + chunkSize >= length) {break;}}log.info("分词结果:[{}]",strList);return strList;}

对于上述文本zuiyu123分词效果如下

下面来看下中文的分词效果:

检索一下,只要我们使用的是包含上述分词结果的条件我们就可以检索的到。

比如我们检索个蛋白质

search result:[[{ID=8dac4d97-f05f-472e-94b2-02828aa235d6, CONTENT=ELYJBkZbfiVaJgTdlgglDg==UYwxxmEMQ9hq1jOax+r5rg==WwCBtglEf6clcWajP9sK+A==4sEGCqZ4P8Osr0dW84zFEA==c2AZejHeUp/5gpPkexfNcg==pvh/TcZRO4zwD+kwbE9lHw==1g30dxyz7z+8TQq+8jYH1A==AsWZOeiprypfrzSK3FtOuw==01vpoSuCXOpKCgcPsNlXyQ==79BPmIhSwMaA7hjN3ENDxA==}]]

可以看到,上述的content字段的内容长度非常的长,所以我们要注意数据库字段长度限制。

除了上面这个方式外,发散一下思维,如果你用过 Elasticsearch 的话,会不会有点想法呢?

因为在中文的场景中,中文既然要分词,选择专业的分词器应该是更合理的啊,所以我们可以使用???

对的,你没猜错,既然是要分词,对于特殊的中文业务场景,直接使用 Elasticsearch 的分词器分词不就好了吗,然后再用 Elasticsearch 的强大检索能力,不就可以满足我们的模糊检索需求了吗,想到就去做,下面就跟着我一起来看下如果用 Elasticsearch 的分词实现密文模糊检索。

分词器分词检索

使用分词器分词进行密文检索的原理:

1、使用 Elasticsearch 自带的正则分词器对加密后的密文进行分词。

2、检索时使用 Elasticsearch 的match进行检索。

本文演示使用AES进行加解密,所以分词器我就直接使用正则匹配,将密文中的内容按照==进行拆分。

下面我们一起进入代码时间,跟随着我的脚本来看看分词密文检索是什么样的。

也欢迎你来实操体验一下,有什么问题欢迎评论区留言告诉我,也可以关注《醉鱼Java》,私信我。

  • 创建一个使用pattern分词器的索引encrypt

    如下创建索引语句为 Elasticsearch 6.8 的语句,如果使用 7+、8+ 的需要修改为对应的版本。

    mappings 中的 _doc

    put 127.0.0.1:9200/encrypt
    {"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer"}},"tokenizer": {"my_tokenizer": {"type": "pattern","pattern": "=="}}}},"mappings": {"_doc": {"properties": {"content": {"type": "text"}}}}
    }
    
  • 随便对于一个密文进行分词,可以看到,已经按照我们的语气进行==拆分为多个词语了

其实不难发现,我们使用 AES 加密,就是对分词之后的每个词语进行加密,然后组成一个新的字符串。

还是上面那句话鱼肉的蛋白质含量真的高,我们看一下分词结果。

所以我们按照==拆分之后,检索式再通过加密之后的密文进行检索,也就相当于分词检索了。

检索结果如下:

search result:[{"hits":[{"_index":"encrypt","_type":"_doc","_source":{"content":"ELYJBkZbfiVaJgTdlgglDg==9hF4g5NErtZNS9qFJGYeZA==uH9W7jvdoLIKq5gOpFjhWg==4sEGCqZ4P8Osr0dW84zFEA==c2AZejHeUp/5gpPkexfNcg==1g30dxyz7z+8TQq+8jYH1A==01vpoSuCXOpKCgcPsNlXyQ==kIzJL/y/pnUbkZGjIkz4tw=="},"_id":"1713343285459","_score":2.8951092}],"total":1,"max_score":2.8951092}]

总结

密文的模糊查询就是以空间成本换取的。相比于存储原文,密文比原文增长了好几倍。

所以根据你的业务场景,选择一个合适的加密算法才是最优解。

参考

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

https://ningyu1.github.io/20201230/encrypted-data-fuzzy-query.html

如果这篇文章对您有所帮助,或者有所启发的话,帮忙点个关注一下,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

wx 搜索《醉鱼Java》,回复面试、获取2024面试资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日刷题】Day7

【每日刷题】Day7 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 2. 203. 移除链表元素 - 力扣&#xff08;…

重磅!Meta 发布 Llama 3,前所未有的强大功能和多模态能力|TodayAI

Meta今日宣布推出其最新一代尖端开源大型语言模型Llama 3。该模型预计很快将在多个领先的云服务平台上线&#xff0c;包括AWS、Databricks、Google Cloud、Hugging Face、Kaggle、IBM WatsonX、Microsoft Azure、NVIDIA NIM和Snowflake。 Llama 3模型得到了AMD、AWS、Dell、In…

【深度学习】yolov5目标检测学习与调试

2024.4.15 -2024.4.16 完结 0.准备&&补充知识点 yolo检测算法可以实现目标检测、分割和分类任务。 项目仓库地址&#xff1a;https://github.com/ultralytics/yolov5 跟练视频&#xff1a;目标检测 YOLOv5 开源代码项目调试与讲解实战 lux下载视频神器&#xff1a;h…

2W 3KVDC 隔离 稳压单输出 DC/DC 电源模块——TPK-SAR 系列介绍

TPK-SAR系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于&#xff1b;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之前要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压…

idea新建一个springboot项目

本文分为几个部分&#xff0c; 首先是在idea中新建项目&#xff0c; 然后是配置 项目的目录&#xff08;新建controller、service、dao等&#xff09;&#xff0c; 然后是自定义的一些工具类&#xff08;比如启动后打印地址等&#xff09;。 1.、创建篇 新建项目&#xff0…

IO基础-传统I/O模型

关于IO数据流有两种形式&#xff0c;来源于网络和磁盘分别叫做网络IO、磁盘IO。 客户端通过TCP和UDP协议将数据流发往服务端&#xff0c;服务端接收数据这个过程称为网络IO。 服务端读取本地文件数据到服务中的过程称为磁盘IO。 基于 Linux 一切皆文件的理念&#xff0c;在内…

[大模型]Qwen-7B-Chat WebDemo

Qwen-7B-Chat WebDemo 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行demo…

AI大模型日报#0419:全球最强开源大模型 Llama 3 发布:15T 数据预训练,参数将超 4000 亿

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 刚刚&#xff0c;全球最强开源大模型 Llama 3 发布&#xff1a;使用 15T 数据预训练&#xff0c;最大模型参数将超 4000 亿 摘要…

【目标跟踪】ByteTrack详解与代码细节

文章目录 一、前言二、代码详解2.1、新起航迹2.2、预测2.3、匹配2.4、结果发布2.5、总结 三、流程图四、部署 一、前言 论文地址&#xff1a;https://arxiv.org/pdf/2110.06864.pdf git地址&#xff1a;https://github.com/ifzhang/ByteTrack ByteTrack 在是在 2021 年 10 月…

书生浦语训练营第2期-第4节笔记

一、为什么要微调&#xff1f; 1. 适应特定任务或领域&#xff1a;虽然预训练的模型通常具有广泛的知识和理解能力&#xff0c;但它们可能不完全适应特定任务的需求。通过在特定的数据集上微调模型&#xff0c;可以使模型更好地理解和处理与特定任务或领域相关的数据。 2. 提高…

【uniapp】微信小程序2024手机号快速验证及无感登录教程(内附代码)

组件&#xff1a;手机号快速验证组件 适用对象&#xff1a;企业/个体 费用&#xff1a;0.03元/次 目录 前言思路前端后端代码无感登录onload事件无感登录方法登录判断后端mini_login2 最后 前言 最近注册了公司&#xff0c;可以注册具有支付能力的小程序了&#xff0c;各种材料…

在Nuxt.js中添加PostCSS自动前缀器

在其他浏览器中&#xff0c;有些 CSS 属性需要带有前缀。如-webkit- | -o- | -ms- 等等 Autoprefixer 是一个 PostCSS 插件&#xff0c;可以将你的CSS代码渲染到浏览器中自动补充厂商前缀&#xff0c;因此你不用担心自己编写的CSS代码有浏览器兼容性问题。 如&#xff1a; .fl…

kaggle咖啡销售分析案例侧重可视化折线图条形图扇形图柱状图

目录 概述 环境依赖 数据描述 代码概述 导包 数据读取 统计缺失值 数据结构概述 描述统计 时间轴数据转换 月交易统计直方图 周交易统计图 小时数据转换 小时折线图 销售关系可视化统计 销售占比扇形图 价格箱线图 各类别多维度条形图统计 商店位置交易量折线…

重磅福利!参与现金红包抽奖活动,赶快行动吧!

文章目录 粉丝福利 粉丝福利 亲爱的朋友们&#xff0c;令人振奋的消息来啦&#xff01;本月&#xff0c;我们特地为大家准备了一份特别的粉丝福利&#xff01;只要您轻轻一点&#xff0c;关注我们的公众号&#xff0c;就有机会抽取现金红包&#xff0c;让您的生活多一份惊喜与喜…

【微信公众平台】扫码登陆

文章目录 前置准备测试号接口配置 带参数二维码登陆获取access token获取Ticket拼装二维码Url编写接口返回二维码接收扫描带参数二维码事件编写登陆轮训接口测试页面 网页授权二维码登陆生成ticket生成授权地址获取QR码静态文件支持编写获取QR码的接口 接收重定向参数轮训登陆接…

游泳耳机哪个牌子好?体验与口碑兼顾的4大游泳耳机汇总!

最近的天气越来越炎热了&#xff0c;许多人选择游泳作为一种既能锻炼身体又能享受清凉的活动。而随着科技的发展&#xff0c;越来越多的运动爱好者希望在游泳时也能享受到音乐的乐趣。因此&#xff0c;游泳耳机应运而生&#xff0c;成为市场上的热门产品。然而&#xff0c;面对…

使用PixVerse使用指定的角色生成视频

PixVerse 是一款可以将文字描述转换为高清视频的AI视频生成工具&#xff0c;它还支持直接生成原神角色的专属动画视频。以下是如何使用PixVerse使用指定的角色生成视频的步骤&#xff1a; 1. 点击PixVerse 网址 访问以下网址&#xff1a;https://app.pixverse.ai/create/vide…

jvm中的垃圾回收器

Jvm中的垃圾回收器 在jvm中&#xff0c;实现了多种垃圾收集器&#xff0c; 包括&#xff1a; 1.串行垃圾收集器 2.并行垃圾收集器 3.CMS&#xff08;并发&#xff09;垃圾收集器 4.G1垃圾收集器 1.串行垃圾回收器 效率低&#xff0c;使用较少 2.并行垃圾回收器 3.并发垃圾回…

软件估算的方法、过程、内容解读(估算指南)

4 估算方法 4.1 基于经验的方法 4.1.1 头脑风暴法 4.1.2 Delphi方法 4.1.2.1 过程图 4.1.2.2 组建评估组 4.1.2.3 系统介绍 4.1.2.4 系统分解与假设 4.1.2.5 设定偏差值 4.1.2.6 个人估计 4.1.2.7 估计结果汇总 4.1.2.8 估计差异讨论 4.1.2.9 结束 4.2 分解的方法…

Brainpan(VulnHub)

Brainpan 1、nmap 2、web渗透 随便看看 目录爆破 使用不同工具&#xff0c;不同字典进行爆破 9999端口分析 10000端口分析 字符串信息中&#xff0c;提示这个程序不能运行在DOS模式下&#xff0c;然后有32个A&#xff0c;还有一行关于复制字节到缓冲区的信息&#xff0c;还有一…