Interview preparation--案例加密后数据的模糊查询
加密数据的模糊查询实现方案
- 我们知道加密后的数据对模糊查询不是很友好,本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路,希望对大家有所启发。
- 为了数据安全我们在开发过程中经常会对重要的数据进行加密存储,常见的有:密码、手机号、电话号码、详细地址、银行卡号、信用卡验证码等信息,这些信息对加解密的要求也不一样,比如说密码我们需要加密存储,一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用时间换安全性)。
- 因此在作完加密之后的字符串之后,加密算法会抹去原来字符的一些特性,让结果字符串没有可识别的特点,这样目的是确保安全性,即使被截获还是无法轻易的破解。但是这样也就造成了查询的复杂性。
- 一般我们在加密数据查询都是用如下方式,利用等值查询来获取:
select * from t_test_aes where message_id = '0xF3F4127D4D1AEC1DC5A620CE5E8C7F4F';
- 以上手段都无法做到模糊查询,例如银行用户的真实用户名,是一个敏感数据,如何模糊查询用户名字是一个难点
加密数据模糊查询方案一
- 数据库中实现加密,解密,有如下SQL
drop table if exists t_test_aes;
CREATE TABLE `t_test_aes` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`message_id` BLOB(20) NOT NULL COMMENT '消息Id',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='aes测试表';
## 添加数据
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message2', 'test_key'));
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message3', 'test_key'));
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message4', 'test_key'));
- 有如上数据库表,我们定义message_id用来做模糊查询,在添加数据时候,不在代码中加密,而是在mysql数据库中加密,利用数据库自己的加密算法完成脱敏,如下insert
## 添加数据
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message2', 'test_key'));
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message3', 'test_key'));
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message4', 'test_key'));
- 同样在查询的时候,也可以用这个方法进行模糊查询
## 查询数据
select * from t_test_aes where AES_DECRYPT(message_id, 'test_key') like '%2%';
select * from t_test_aes where message_id = '0xF3F4127D4D1AEC1DC5A620CE5E8C7F4F';
优缺点
- 优点是实现成本低,开发使用成本低,只需要将以往的模糊查找稍微修改一下就可以实现
- 缺点也很明显,这样做无法利用数据库的索引来优化查询,甚至有一些数据库可能无法保证与程序实现一致的加解密算法,但是对于常规的加解密算法都可以保证与应用程序一致
加密数据模糊查询方案二
- 对密文数据进行分词组合,将分词组合的结果集分别进行加密,然后存储到映射表,查询时通过key like ‘%partial%’,这是一个比较划算的实现方法,我们先来分析一下它的实现思路
- 先对字符进行固定长度的分组,将一个字段拆分为多个,比如说根据4位英文字符(半角),2个中文字符(全角)为一个检索条件,举个例子:
test_message_one 使用4个字符为一组的加密方式, 第一组test,第二组est_,第三组st_m,第四组t_mes … 依次类推。
-
如果需要检索所有包含检索条件4个字符的数据比如:test,加密字符后通过 key like “%partial%” 查库。
-
重要:要实现以上加密算法的模糊查询,必须有固定的加密算法满足以下需求:
假如原序列 A 加密后的 值是X
那么存在 A的连续子序列 B 加密后的值是Y
必须保证 Y 也是X 的连续子序列
例如如下加密算法的结果久满足需求:
test_message_one 加密后值为 whvwbphvvdjhbrqh
test 加密之后的值为 whvw
- 依据以上分析,我们有如下Sql案例做具体说明:
drop table if exists t_test_aes_target;
CREATE TABLE `t_test_aes_target` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`message_id` varchar(256) NOT NULL COMMENT '消息Id',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='加密测试表';drop table if exists t_test_aes_sub;
CREATE TABLE `t_test_aes_sub` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`target_id` bigint(20) NOT NULL COMMENT 'id',`origin_msg` varchar(256) NOT NULL COMMENT '消息Id',`message_id_buf` varchar(256) NOT NULL COMMENT '消息Id',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='拆分加密测试表';
- 添加如下加密数据到目标数据表中:
insert into t_test_aes_target(id, message_id) values (1, 'whvwbphvvdjhbrqh');
- 添加如下拆分后的关连数据到如下表中:
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'test' , 'whvw');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'est_' , 'hvwb');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'st_m' , 'vwbp');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 't_me' , 'wbph');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, '_mes' , 'bphv');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'mess' , 'phvv');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'essa' , 'hvvd');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'ssag' , 'vvdj');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'sage' , 'vdjh');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'age_' , 'djhb');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'ge_o' , 'jhbr');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'e_on' , 'hbrq');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, '_one' , 'brqh');
- 加密算法说明:我们可以采用一种简单的方法:将原字符串转换为一个固定大小的数组,然后对数组中的每个元素进行简单的变换(例如,ASCII值加一个固定偏移量)。这样,当子字符串被加密时,由于它是原字符串的一部分,其加密结果自然也是原字符串加密结果的子串
// 加密方法public static String encrypt(String input) {return shiftString(input, SHIFT);}// 通过ASCII值偏移量来加密字符串private static String shiftString(String input, int shift) {char[] chars = input.toCharArray();for (int i = 0; i < chars.length; i++) {chars[i] = (char) (chars[i] + shift);}return new String(chars);}public static List<String> splitStringByCharacterType(String input, Integer num) {if(StringUtils.isBlank(input)){return Arrays.asList();}if(input.length() <= 4){return Arrays.asList(input);}List<String> result = new ArrayList<>();for (int i = 0; i <= input.length() - 4; i++) {result.add(input.subSequence(i, i+4).toString());}return result;}
- 通过以上加密方式以及数据维护方式来维护的数据,可以用如下查询来完成:
- 第一直接通过子字符串 的加密密文模糊查询
select * from t_test_aes_target where message_id like '%whvw%';
- 第二,通过关联表来查询,关联表通过test加密密文查询出关联id,通过id主键查询完成:
select * from t_test_aes_target where id in (select id from t_test_aes_sub where message_id_buf like '%whvw%');
优缺点
- 优点就是实现起来不算复杂,使用起来也较为简单,算是一个折中的做法,因为会有扩展字段存储成本会有升高,但是可利用数据库索引优化查询速度,推荐使用这个方法。
- 缺点这个方法虽然可以实现加密数据的模糊查询,但是对模糊查询的字符长度是有要求的,以我上面举的例子模糊查询字符原文长度必须大于等于4个英文/数字,或者2个汉字,再短的长度不建议支持,因为分词组合会增多从而导致存储的成本增加,反而安全性降低。而且这种加密算法的安全性不高
相关文章:

Interview preparation--案例加密后数据的模糊查询
加密数据的模糊查询实现方案 我们知道加密后的数据对模糊查询不是很友好,本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路,希望对大家有所启发。为了数据安全我们在开发过程中经常会对重要的数据进行加密存储,常见的有࿱…...

一个简单的R语言数据分析案例
在R语言中,数据分析可以涵盖广泛的领域,包括描述性统计、探索性数据分析、假设检验、数据可视化、机器学习等。以下是一个简单的R语言数据分析案例,该案例将涵盖数据导入、数据清洗、描述性统计、数据可视化以及一个简单的预测模型。 案例&a…...

springCloudAlibaba之分布式事务组件---seata
Seata Sea学习分布式事务Seata二阶段提交协议AT模式TCC模式 Seata服务搭建Seata Server(事务协调者TC)环境搭建seata服务搭建-db数据源seata服务搭建-nacos启动seata服务 分布式事务代码搭建-client端搭建接入微服务应用 Sea学习 事务:事务是…...

无公网IP与服务器完成企业微信网页应用开发远程调试详细流程
文章目录 前言1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 前言 本文主要介绍如何在企业微信开发者中心通过使用内网穿透工具提供的公网域名成功验证回调本地接口服务! …...

CSS 字体颜色渐变
CSS 字体颜色渐变 css 代码: 注意:background: linear-gradient(属性),属性可以调整方向 例如:to bottom 上下结构,to right 左右结构font-family: DIN, DIN;font-weight: normal;font-size: 22px;color:…...

【机器学习】基于CTC模型的语音转换可编辑文本研究
1.引言 1.1语音识别技术的研究背景 1.1.1.语音识别技术的需求 语音识别技术的研究和发展,对于提升人类与机器的交互方式具有深远的影响。首先,它极大地提高了工作效率和便利性。通过语音指令控制设备,用户可以更快捷地完成任务,…...

数据结构错题答案汇总
王道学习 第一章 绪论 1.1 3.A 数据的逻辑结构是从面向实际问题的角度出发的,只采用抽象表达方式,独立于存储结构,数据的存储方式有多种不同的选择;而数据的存储结构是逻辑结构在计算机上的映射,它不能独立于逻辑结构而存在。数…...

搞AI?中小企业拿什么和大厂拼?
近期,苹果发布M4芯片,号称“比当今任何AI PC的任何神经引擎都强!”紧随其后微软携“CopilotPCs”的概念加入AI PC激战。截至目前,包括联想、惠普、华为等多家主流PC厂商在内,已经至少推出了超50款AI PC产品。 AI重塑行…...

光伏电站阵列式冲击波声压光伏驱鸟器
光伏电站内鸟群的聚集可不是一件好事,鸟类排泄物,因其粘度大、具有腐蚀性的特点,一旦堆积在太阳能板上,会严重影响光伏电站的发电效率。长期积累的鸟粪不仅难以清洗,还可能引发组件的热斑效应,严重时甚至可…...

Webrtc支持FFMPEG硬解码之解码实现(三)
前言 此系列文章分分为三篇, Webrtc支持FFMPEG硬解码之Intel(一)-CSDN博客 Webrtc支持FFMPEG硬解码之NVIDA(二)-CSDN博客 Webrtc支持FFMPEG硬解码之解码实现(三)-CSDN博客 AMD硬解目前还没找到可用解码器,欢迎留言交流 环境 Windows平台 VS2019 <...

RIP协议
RIP基本概念 RIP(Routing Information Protocol)是一种基于距离矢量的路由协议,用于在自治系统(AS)内的网关之间交换路由信息。RIP 是一种相对简单且广泛使用的内部网关协议(IGP),适…...

计算机视觉与深度学习实战,Python为工具,基于光流场的车流量计数应用
一、引言 随着科技的飞速发展,计算机视觉和深度学习技术在现代社会中的应用越来越广泛。其中,车流量计数作为智能交通系统的重要组成部分,对于城市交通管理和规划具有重要意义。本文旨在探讨以Python为工具,基于光流场的车流量计数应用,为智能交通系统的发展提供技术支撑。…...

插入排序(排序算法)
文章目录 插入排序详细代码 插入排序 插入排序,类似于扑克牌的玩法一样,在有序的数组中,扫描无序的数组,逐一的将元素插入到有序的数组中。 实现细节: 从第一个元素开始,该元素可以认为已经被排序取出下…...

【附带源码】机械臂MoveIt2极简教程(六)、第三个demo -机械臂的避障规划
系列文章目录 【附带源码】机械臂MoveIt2极简教程(一)、moveit2安装 【附带源码】机械臂MoveIt2极简教程(二)、move_group交互 【附带源码】机械臂MoveIt2极简教程(三)、URDF/SRDF介绍 【附带源码】机械臂MoveIt2极简教程(四)、第一个入门demo 【附带源码】机械臂Move…...

innovus:route secondary pg pin
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 innovus route secondary pg pin分以下几步: #设置pg net连接 globalNetConnect VDD_AON -type pgpin -pin VNW #设置ndr rule,具体绕线层次跟signal绕…...

btstack协议栈实战篇--LE Peripheral - Test Pairing Methods
btstack协议栈---总目录_bt stack是什么-CSDN博客 目录 1.Main Application Setup 2.Packet Handler 3.btstack_main 4.log信息 首先先理解一下,ble中的central,Peripheral,master和slave的理解? 以下是对这些概念的理解: “Central”(中心设备):与“Maste…...

git下载项目登录账号或密码填写错误不弹出登录框
错误描述 登录账号或密码填写错误不弹出登录框 二、解决办法 控制面板\用户帐户\凭据管理器 找到对应的登录地址进行更新或者删除 再次拉取或者更新就会提示输入登录信息...

平移矩阵中的数学思考
《webgl编程指南》中,“平移矩阵”中相关值的得出 是基于“矩阵和向量相乘所得的等式”与“向量表达式”组成一个方程组 xaxbyczd xxTx 书中说,根据上面的方程组,可以很容易得出 a1、b0、c0、dTx 0、问题来了! 我也确实可以看…...

【机器学习】Qwen2大模型原理、训练及推理部署实战
目录 一、引言 二、模型简介 2.1 Qwen2 模型概述 2.2 Qwen2 模型架构 三、训练与推理 3.1 Qwen2 模型训练 3.2 Qwen2 模型推理 四、总结 一、引言 刚刚写完【机器学习】Qwen1.5-14B-Chat大模型训练与推理实战 ,阿里Qwen就推出了Qwen2&#x…...

JetLinks开源物联网平台社区版部署教程
1.上github搜素jetlinks 2.找到源代码,并且下载到本地。 3.项目下载完成之后,还需要另外下载三个核心依赖模块。在github找到jetlinks。 4.点击进去下载,下载完成之后,你会发现里面有三个文件夹是空白的,先不用理会&am…...

QT学习过程中遇到的问题自记
文章目录 前言问题1问题2问题3 前言 学习QT嵌入式实战开发(从串口通信到JSON通信微课视频版)的过程中遇到的几个小问题 问题1 1.将书中的示例代码导入自己的电脑,然后点击工程进去,不能运行,报错 no kits are enabled for this project… 我…...

自学网络安全的三个必经阶段(含路线图)
一、为什么选择网络安全? 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前踏入…...

gitlab下载及安装
目录 1、gitlab下载 2、gitlab安装 3、完全卸载GitLab 1、gitlab下载 首页:https://about.gitlab.com 安装:https://about.gitlab.com/install rpm包:https://packages.gitlab.com/gitlab/gitlab-ce 2、gitlab安装 2.1 CentOS 7 rpm -iv…...

YOLOv10改进|采用ADown降采样模块有效融合
📚 专栏地址:《YOLOv10算法改进实战》 👉 独家改进,对现有YOLOv10进行二次创新,提升检测精度,适合科研创新度十足,强烈推荐 🌟 统一使用 YOLOv10 代码框架,结合不同模块来构建不同的YOLO目标检测模型。 💥 本博客包含大量的改进方式,降低改进难度,改进点包含【B…...

libGL.so.1: cannot open shared object file: No such file or directory
Ubuntu 安装 PaddleOCR 时报错 libGL.so.1: cannot open shared object file: No such file or directory解决办法: # 这个好像GPU 服务器更好用 pip install opencv-python-headless如果不行就: # 尝试安装缺失的libGL.so.1文件。在大多数Linux发行版…...

2024年消防设施操作员考试题库及答案
一、单选题 31.工作时间是指劳动者根据国家的法律规定,在1个昼夜或1周之内从事本职工作的时间。《劳动法》规定劳动者每日工作时间不超过8h,平均每周工作时间不超过()h。 A.44 B.45 C.46 D.50 答案:A 解析&…...

30字以内免费翻译维吾尔语,汉维翻译工具推荐,维吾尔文字母OCR识别神器《维汉翻译通》App!
维吾尔文OCR文字识别 《维汉翻译通》App内置的OCR技术,能够快速识别图片中的文字和字母,无论是路标、菜单还是书籍,都能迅速转换为用户所需的语言,让语言障碍不再是问题。针对维吾尔语更是进行了专门的优化,即便是手写…...

省市县选择三级联动(使用高德API实现)
省市县选择如果自己实现是比较麻烦的,最近发现可以使用高德实现省市县联动选择,实现后来记录一下供大家参考。 文章目录 最终效果:一、准备工作二、完整页面代码 最终效果: 实现单次点击获取省市县名称,选择完成后返回…...

【数据结构(邓俊辉)学习笔记】图06——最小支撑树
文章目录 0. 概述1. 支撑树2. 最小支撑树3. 歧义性4. 蛮力算法5. Prim算法5.1 割与极短跨越边5.2 贪心迭代5.3 实例5.4 实现5.5 复杂度 0. 概述 学习下最小支撑树和prim算法。 1. 支撑树 最小的连通图是树。 连通图G的某一无环连通子图T若覆盖G中所有的顶点,则称…...

海豚调度清理:使用 API 轻松清理历史工作流实例以及日志文件
💡 本系列文章是 DolphinScheduler 由浅入深的教程,涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 祝开卷有益。 大数据学习指南 大家好,我是小陶,DolphinS…...