当前位置: 首页 > news >正文

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--案例加密后数据的模糊查询

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

一个简单的R语言数据分析案例

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

springCloudAlibaba之分布式事务组件---seata

Seata Sea学习分布式事务Seata二阶段提交协议AT模式TCC模式 Seata服务搭建Seata Server&#xff08;事务协调者TC&#xff09;环境搭建seata服务搭建-db数据源seata服务搭建-nacos启动seata服务 分布式事务代码搭建-client端搭建接入微服务应用 Sea学习 事务&#xff1a;事务是…...

无公网IP与服务器完成企业微信网页应用开发远程调试详细流程

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

CSS 字体颜色渐变

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

【机器学习】基于CTC模型的语音转换可编辑文本研究

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

数据结构错题答案汇总

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

搞AI?中小企业拿什么和大厂拼?

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

光伏电站阵列式冲击波声压光伏驱鸟器

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

Webrtc支持FFMPEG硬解码之解码实现(三)

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

RIP协议

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

计算机视觉与深度学习实战,Python为工具,基于光流场的车流量计数应用

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

插入排序(排序算法)

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

【附带源码】机械臂MoveIt2极简教程(六)、第三个demo -机械臂的避障规划

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

innovus:route secondary pg pin

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 innovus route secondary pg pin分以下几步&#xff1a; #设置pg net连接 globalNetConnect VDD_AON -type pgpin -pin VNW #设置ndr rule&#xff0c;具体绕线层次跟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编程指南》中&#xff0c;“平移矩阵”中相关值的得出 是基于“矩阵和向量相乘所得的等式”与“向量表达式”组成一个方程组 xaxbyczd xxTx 书中说&#xff0c;根据上面的方程组&#xff0c;可以很容易得出 a1、b0、c0、dTx 0、问题来了&#xff01; 我也确实可以看…...

【机器学习】Qwen2大模型原理、训练及推理部署实战

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

JetLinks开源物联网平台社区版部署教程

1.上github搜素jetlinks 2.找到源代码&#xff0c;并且下载到本地。 3.项目下载完成之后&#xff0c;还需要另外下载三个核心依赖模块。在github找到jetlinks。 4.点击进去下载&#xff0c;下载完成之后&#xff0c;你会发现里面有三个文件夹是空白的&#xff0c;先不用理会&am…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...