分词组合加密实现加密后可模糊查询

分词组合加密实现加密后可模糊查询

之前有次遇到一个数据库敏感字段脱敏的需求,
使用mybaits对数据库内的敏感字段进行加解密,
但是在加密储存之后,业务上但凡涉及到加密的字段都没办法进行模糊搜索 

Mybatis插件对指定字段加解密

最近要实现这个字段加密之后支持模糊搜索,经查阅资料大致有以下几种方法(建议先看实现代码,否则可能看的有点绕):
1、创建明文字段:【不可取】给需要加密的字段创建一个保存明文的字段,模糊查询去查明文字段,其他查询去查加密字段。 (吐槽下,这都不能被称之为一个方案,本来就是要加密那些敏感信息,结果库里还是有明文相当于脱了裤子放屁);

2、分词组合加密【常用】:此类加密针对字符类型(数值类型的字段也影响不大,改成字符类型然后程序里用到的地方给转成数值类型就行,或者在解密插件配置操作这张表的时候把解密后的字符串转数值类型),这种方法有个前提,要有一个字段用来储存对应加密字段的分词组合加密密文,原理就是在保存一个字符串之前先按照一定长度给它拆分,然后每拆分一次就加密一次得到一个加密串,最后将所有加密串组合起来储存,在模糊搜索的时候对模糊搜索的条件也进行相同操作然后去比对这个分词组合加密串;


3、特定的算法【没研究明白】:大概意思是采用一个特殊的算法,可以把数据加密,且查询条件加密经过加密后可以直接作为模糊搜索条件去匹配加密的字段,查询资料的时候基本最后都有一句需要专业的算法工程师搞一个算法;


4、先解密后查询【小数据量可以】:如果加密的字段不多且数据量不大,每次查询前先获取所有数据,且对加密字段进行解密,在内存里进行模糊查询;


5、数据库层面加解密【增加数据库压力】:保存数据的时候调用数据库函数进行加密,模糊查询的时候先解密字段再模糊查询:select * fom table where 解密函数(加密字段) like ‘%…%’;如此;


6、分词组合不加密【容易被破解】:相比分词组合加密,用来模糊搜索的分词组合字段直接储存明文,模糊查询的时候查询条件分词后无需加密直接匹配,,性能是高了一点,省去了两步加密操作,且数据库里存储分词查询条件会短一点,,但是安全性折扣了很多,但凡被获取到这个分词查询条件可以经过暴力测试分词长度破译;

【分词组合加密】代码实现:

public class CryptographicFuzzySearch {// 代数据库private static Map<String,String> db = new HashMap<>(64);// 数据加密保存字段private static final String COLUMN_DATA_ENCRYPT = "column_data_encrypt";// 数据分词组合加密保存字段private static final String COLUMN_CUT_DATA_ENCRYPT = "column_cut_data_encrypt";public static void main(String[] args) {String sourceData = "hello,world";String searchData = "hello";int cutLength = 4;// 原数据分词加密组合List<String> sourceDataCutArray = strCut(cutLength, sourceData);String sourceDataCutEncryptStr = sourceDataCutArray.stream().map(item -> AesUtil.encode(item)).collect(Collectors.toList()).stream().collect(Collectors.joining());// 原数据加密String sourceDataEncrypt = AesUtil.encode(sourceData);// 保存db.put(COLUMN_DATA_ENCRYPT,sourceDataEncrypt);db.put(COLUMN_CUT_DATA_ENCRYPT,sourceDataCutEncryptStr);// 打印数据System.out.println(JSONUtil.toJsonStr(db));// 查询条件分词加密组合List<String> searchDataCutArray = strCut(cutLength, searchData);String searchDataCutEncryptStr = searchDataCutArray.stream().map(item -> AesUtil.encode(item)).collect(Collectors.toList()).stream().collect(Collectors.joining());// 查询if (db.get(COLUMN_CUT_DATA_ENCRYPT).contains(searchDataCutEncryptStr)){System.out.println("模糊查询匹配成功,查询条件原文:" + searchData + "   分词加密组合后:" + searchDataCutEncryptStr);System.out.println("原数据分词加密组合:" + db.get(COLUMN_DATA_ENCRYPT));System.out.println("原数据解密:" + AesUtil.decode(db.get(COLUMN_DATA_ENCRYPT)));}else{System.out.println("模糊查询未匹配!!!");}}/*** 分词* @param length 分词长度* @param text  明文数据* @return*/public static List<String> strCut(int length , String text){List<String> result = new LinkedList<>();for(int i = 0; i < text.length()-length+1; i++){String substring = text.substring(i, i + length);result.add(substring);}return result;}}/*** aes加密工具类*/
class AesUtil {public final static byte[] KEY = "thisisencodekey".getBytes();private static SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, KEY);/*** 加密** @param data* @return*/public static String encode(String data) {try {if (StringUtils.isEmpty(data)) {return data;}return aes.encryptHex(data);} catch (Exception e) {e.printStackTrace();}return data;}/*** 解密** @param data* @return*/public static String decode(String data) {try {String decryptStr = aes.decryptStr(data);return ("null").equals(decryptStr) ? "" : decryptStr;} catch (Exception e) {e.printStackTrace();}return data;}
}

经此,和加解密插件结合,就能实现一个自动划加解密且支持模糊搜索的功能了!

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

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

相关文章

鸿蒙原生应用元服务开发-WebGL网页图形库开发接口说明

一、场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理&#xff0c;比如绘制彩色图形等。目前该功能仅支持使用兼容JS的类Web开发范式开发。 二、接口说明 表1 WebGL主要接口列表 本文参考引用HarmonyOS官方开发文档&#xff0c;基于API9。

期货开户市场的风险在哪里?

期货市场的风险在哪里&#xff1f;强平和穿仓是什么&#xff1f; 期货市场是一个自带杠杆的市场&#xff0c;简单理解就是我们只需要用10W就能买到价值100万的商品。期货主要的风险来源于仓位风险和交割风险&#xff0c;仓位风险就是我们是采用满仓还是轻仓方式交易。比如我们…

html5cssjs代码 003 50以内的乘法算式

html5&css&js代码 003 50以内的乘法算式 一、代码二、解释 综合应用代码示例。50以内的乘法算式。 一、代码 <!DOCTYPE html> <html lang"en"> <head><title>20以内的乘法</title><meta charset"UTF-8"><…

【和谐身心】植物神经紊乱?调整心态,重拾生活平衡!

在快节奏的现代生活中&#xff0c;许多人可能会遭遇植物神经紊乱的困扰&#xff0c;表现为焦虑、失眠、心悸等症状&#xff0c;严重影响生活质量。但请记住&#xff0c;您并不孤单&#xff0c;让我们一起探索如何调整心态&#xff0c;缓解这些不适&#xff0c;恢复身心和谐。 植…

32个关键字详解①(C语言)

目录 关键字分类&#xff1a; 第一个C程序 - 补充内容 变量的定义与声明 - 补充内容 变量的分类 - 补充内容 变量的作用域 - 补充内容 变量的生命周期 - 补充内容 auto 关键字 register 关键字 static 关键字 static 修饰变量&#xff1a; static修饰函数 sizeof 关键字 基本数…

docker私有仓库-harbor的搭建

docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker di…

全排列+力扣

题目 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 题目描述 代码实现 class Solution {vector<vector<int>> ret;vector<int> path;bool used[7]; public:vector<vector<int>> permute(vector<int>& nums) {_permute(nums…

C++_包装器

目录 1、包装器的用法 2、包装器的类型 3、包装器的作用 4、包装成员函数 5、bind&#xff08;绑定&#xff09; 5.1 bind的用法 5.2 bind减少参数个数 结语 前言&#xff1a; C11的包装器&#xff0c;总称为function包装器&#xff0c;而包装器又称适配器…

allegro PCB设计心得笔记(二) -- ERROR(SPMHUT-144): Illegal arc specification

使用Allegro PCB Editor设计PCB&#xff0c;其中使用了中文丝印&#xff0c;设计完成后&#xff0c;进行Tools -> Database Check&#xff0c;提示如下错误&#xff1a; 对PCB文件进行反复检查&#xff0c;也没有找到具体问题&#xff0c;但是删除中文丝印封装后&#xff0c…

vue3 uniapp 项目初始化集成配置【开箱即用】

https://gitee.com/charrie/vue3-uniapp-init 技术说明 采用vue3viteuniapp技术栈&#xff0c;setup语法糖编码方式引入unocss量子化样式引擎&#xff0c;动态css不用自己写样式&#xff0c;引用class即可&#xff0c;降低代码体积全局请求入口已封装&#xff0c;使用时自己封…

宝塔面板配置网站通过ip地址+端口,页面刷新无效。nginx反向代理后端端口。添加/xxx文件然后再访问项目。

宝塔面板配置网站通过ip地址端口&#xff0c;页面刷新无效。nginx反向代理后端端口。添加/xxx文件然后再访问项目。 一般来说vue项目build打包以后 如果 直接发布服务器 并且不使用后端接口。 是不需要配置nginx的。 假设我vue部署好了。我的ip是106.66.66.66. 但是我页面里面…

PLC数据采集网关是如何应用的?-天拓四方

PLC数据采集网关通过以太网、串口等通信接口与PLC设备连接&#xff0c;实现数据的实时采集。网关内置数据处理模块&#xff0c;可以对采集到的数据进行清洗、转换和存储&#xff0c;以满足不同应用场景的需求。同时&#xff0c;PLC数据采集网关支持多种通信协议&#xff0c;如M…

2.2 关系操作

目录 2.2.1 基本的关系操作 常用的关系操作 关系操作的特点 2.2.2 关系数据语言的分类 关系代数语言&#xff1a; 关系演算语言&#xff1a; 元组关系演算语言 域关系演算语言 2.2.1 基本的关系操作 常用的关系操作 查询操作&#xff1a;选择、投影、连接、除、并、差…

1.Spring核心功能梳理

概述 本篇旨在整体的梳理一下Spring的核心功能,让我们对Spring的整体印象更加具体深刻,为接下来的Spring学习打下基础。 本片主体内容如下: Bean的生命周期依赖注入的实现Bean初始化原理推断构造方法原理AOP的实现这里要说明一下,我们这里说到的Spring,一般指的是Spring F…

Linux软件高级编程-网络--TCP通信--day14

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK 2.在通信过程中通过序列号和确认号保障数据传输的完整性 本次发送序列号:上次收到的确…

基于Java (spring-boot)的房屋租赁系统

一、项目介绍 有以下模块 角色&#xff1a;用户、管理员、房东 管理员&#xff1a;个人中心、房屋类型管理、房屋信息管理、预约看房管理、合同信息管理、房屋报修管理、房屋评价管理、系统管理 用户:个人中心、房屋信息管理、预约看房管理、合同信息管理、房屋报修管理、房屋…

Apache Hive(三)

一、Apache Hive 1、ETL数据清洗 数据问题 问题1&#xff1a;当前数据中&#xff0c;有一些数据的字段为空&#xff0c;不是合法数据 解决&#xff1a;where 过滤 问题2&#xff1a;需求中&#xff0c;需要统计每天、每个小时的消息量&#xff0c;但是数据中没有天和小时字段…

差分逻辑电平 --- LVDS、CML、LVPECL互连

前言 首先了解差分逻辑电平结构&#xff0c;也包括单端逻辑电平 地址&#xff1a;常见的逻辑电平_常用的逻辑电平-CSDN博客 注&#xff1a;ECL >> PECL >> LVPECL演变而来&#xff1b;QDR&#xff08;Quad Data Rate):四倍数据倍率 本文章只涉及差分逻辑电平:LVDS…

在dpvs上实现ICMP的源进源出

目录 1. 缘起2. 源码分析3. 让ICMP也走源进源出1. 缘起 在网络通信中,当一个请求报文从源主机到达目标主机,并经过中间路由器或交换机进行转发时,请求报文进入主机A的路径和响应报文离开主机A的路径可能不同。这种情况下,就会出现所谓的三角路径问题。如下图: 具体来说,…

如何在jupyter Notebook中下载第三方包

!python -m spacy download zh_core_web_sm -i https://pypi.doubanio.com/simple/