密文字段模糊检索方案

代码地址: 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…

XiaodiSec day020 Learn Note 小迪渗透学习笔记

XiaodiSec day020 Learn Note 小迪渗透学习笔记 记录得比较凌乱&#xff0c;不尽详细 php 缺陷 2024.1.29 00:32 前言 在课程安排上先讲语言缺陷&#xff0c;再讲漏洞 函数缺陷与绕过 CTF 详细点: intval strpos in_array preg_match str_replace 开始 1a 1 1admin …

代码随想录-哈希表 | 1两数之和

代码随想录-哈希表 | 1两数之和 LeetCode 1-两数之和解题思路代码复杂度难点总结 LeetCode 1-两数之和 题目链接 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。…

【深度学习】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…

Zookeeper和Redis分别实现分布式锁的原理

目录 分布式锁的概述 ZooKeeper实现分布式锁的原理 Redis实现分布式锁的原理 ZooKeeper分布式锁的工具类 Redis分布式锁的工具类 对比 分布式锁的概述 分布式锁是一种在分布式系统中用来同步多个进程对共享资源访问的机制。它可以保证在同一时刻&#xff0c;只有一个进程…

若依OSS如何支持本地上传,保存到服务器本地?

SysOssController改动&#xff1a; GetMapping("/downloadByName/**")public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {String path (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPP…

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 月…

Excel 解析工具类实现Demo,通过XSSFSheetXMLHandler使用实现

文章目录 一、功能概述二、BigExcelAnalysisUtil类三、SheetRuleUtil 类其他SheetContentsHandler 使用讲解 一、功能概述 可以校验表头以sheet维度&#xff0c;读取数据可以根据反射&#xff0c;自动把excel中的数据封装到bean主要使用了OPCPackage、XSSFReader、XSSFSheetXM…

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

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

G口服务器的作用是什么?

对于大型的网络游戏企业和网络媒体视频等服务一般都使用带宽比较大一点的网络配置&#xff0c;而G口服务器则就是指带宽1G以上的服务器&#xff0c;非常适用于对带宽和流量要求比较高的业务需求&#xff0c;那G口服务器的作用是什么呢&#xff1f; G口服务器能够用来部署一些大…

【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…

Spark:性能调优实战

链接&#xff1a; 文字文档 极客链接 一、资源申请&并行度 spark.executor.cores一个Executor中同时可以执行的task数目&#xff08;在Executor内存不变的情况下&#xff0c;executor-cores数越大&#xff0c;平均下来一个task可以使用的内存就越少&#xff09; spark.…

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

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