加密后的数据该如何支持模糊查询

news2024/11/15 13:36:41

加密后的数据该如何支持模糊查询

  • 在日常工作中,我们经常会有一些模糊查询的条件,比如说按照手机号模糊查询,或者是身份证号码。正常情况下我们可以使用

  •   select * from user where mobile like %123% 
    
  • 来模糊查询,但是这种方式是在你的手机号码没有加密的前提下,但是对于一些用户私密数据,我们在数据库都会进行加密保存。这时候有些人会说,那我把条件也加密,然后进行模糊查询不就可以了吗?事实真是这样吗?

  • 看下面这个例子,我们将手机号进行加密,这时候我们要搜索手机前缀为136的手机号,这时候你讲条件进行加密,然后查询,你会发现,加密出来的是二个完全不一样的字符串,所以你根本就查不出来

  • 在这里插入图片描述

方案一(数据量少可用,数据量多不推荐)

  • 第一种方案就是我们可以将所有数据都查询出来,然后在内存中将所有的手机号进行解密,然后在做一个匹配,这种方式优缺点也很明显
  • 优点
  • 简单方便,没有复杂的实现逻辑
  • 缺点
  • 每次查询都需要把整张表的数据都查询来,然后将所有的手机号进行解密
  • 如果数据量过大,就会导致OOM的异常

方案二(解决了,又好像没解决)

  • 我们现在是要按照手机号进行一个模糊查询,这时候我们可以建一张表,这张表就的字段有二个,一个是手机号,一个是手机号加密后的数据

  •  id   mobile                mobileSm4                                     userID
      1    13687976543           cnjdwcnbdsjbcxsbchbxchsjbcndsjc                 1
      2    17826767634           ncjnwcsdncjndcjnkdjsncjkdsbcjkbsdcjksk          2
    
  • 这时候比如我们要查询手机号前缀是 178 的数据,我们可以先查这张表 select userId from user_mobile where mobile like %178%

  • 这时候就可以拿到对应的userId,然后再去用户表去查询我们需要的记录,看起来好像是解决了这个问题,但是仔细想想,我们的手机号还是没有加密存储,所以说好像是解决了这个问题,但是好像又没解决,手机号还是存在明文存储

方案(推荐:分片加密存储)

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

  • 比如:taobao123

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

  • 第一组 taob ,第二组aoba ,第三组obao ,第四组 bao1 … 依次类推

  • 如果需要检索 所有包含 检索条件4个字符的数据 比如:aoba ,加密字符后通过key like “%partial%” 查库。

  • 我们的手机号是11位数,我们每4位作为一个分片

  • public static void main(String[] args) {
        String mobile = "12345678765";
        int index = 0;
        for(;;) {
            String str = mobile.substring(index);
            if(str.length() < 4) {
                break;
            }
            String newStr = mobile.substring(index,index + 4);
            System.out.println(newStr);
            index ++;
        }
    }
    
    -- 拆分之后的数据
    1234
    2345
    3456
    4567
    5678
    6787
    7876
    8765
    
  • 将拆分之后的每一个数据都进行加密

  • public static void main(String[] args) {
        String mobile = "12345678765";
        int index = 0;
        for(;;) {
            String str = mobile.substring(index);
            if(str.length() < 4) {
                break;
            }
            String newStr = mobile.substring(index,index + 4);
            //加密
            System.out.println(Sm4Util.encryptContent(newStr));
            index ++;
        }
    }
    
    -- 拆分之后加密的数据
    
    u8tmlwJVnLfvZ2UCNNq1cQ==
    6jM7/pmu96lzVf2MawpvhA==
    bReLKTeGKg4qBpM9PujKSw==
    PkzJbyfDMU8r89lzx3+6oQ==
    AO9h/+dppoQkTHuxVpuWHA==
    pcTePBiRWEu1i9ad/SvmyA==
    AlmQNdcUyvO5Te3eGZCl2Q==
    84NxP14emISlfmL4oWZdwA==
    
  • 这时候我们数据库就有一个手机号加密之后的扩展字段,如下

  •  id              mobile                                         mobileSm4                                     
       1    u8tmlwJVnLfvZ2UCNNq1cQmckdmwcknkwdc           u8tmlwJVnLfvZ2UCNNq1cQ==6jM7/pmu96lzVf2MawpvhA==bReLKTeGKg4qBpM9PujKSw==PkzJbyfDMU8r89lzx3+6oQ==pcTePBiRWEu1i9ad/SvmyA==      
    
  • 我们将拆分后的每一个分片加密后的数据进行拼接,最后保存到扩展字段里面去

  • 那么在查询的时候,比如说查询 1365 ,这时候1365这个数据是我们之前可能存在的一个分片数据,将1365进行加密,然后在扩展字段中进行模糊查询即可

  • 但是使用分片的话会有几个缺点

  • 比如我们现在手机号是按照4个数字进行分片,如果模糊查询的条件是136,三个数字,那么这时候就查不到了,当然如果你按照3个数字进行分片就可以了,但是不建议

  • 我们要增加扩展字段来保存分片数据,存储需要更大的空间

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

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

相关文章

〖大前端 - 基础入门三大核心之JS篇(58)〗- 面向对象案例

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

【深度学习】序列生成模型(五):评价方法计算实例:计算BLEU-N得分【理论到程序】

文章目录 一、BLEU-N得分&#xff08;Bilingual Evaluation Understudy&#xff09;1. 定义2. 计算N1N2BLEU-N 得分 3. 程序 给定一个生成序列“The cat sat on the mat”和两个参考序列“The cat is on the mat”“The bird sat on the bush”分别计算BLEU-N和ROUGE-N得分(N1或…

uniapp运行到手机模拟器

第一步&#xff0c;下载MUMU模拟器 下载地址&#xff1a;MuMu模拟器官网_安卓12模拟器_网易手游模拟器 (163.com) 第二步&#xff0c;运行mumu模拟器 第三步&#xff0c;运行mumu多开器 第三步&#xff0c;查看abs 端口 第四步&#xff0c;打开HBuilder,如下图&#xff0c;将…

探索 Vuex 的世界:状态管理的新视角(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

大模型赋能“AI+电商”,景联文科技提供高质量电商场景数据

据新闻报道&#xff0c;阿里巴巴旗下淘天集团和国际数字商业集团都已建立完整的AI团队。 淘天集团已经推出模特图智能生成、官方客服机器人、万相台无界版等AI工具&#xff0c;训练出了自己的大模型产品 “星辰”&#xff1b; 阿里国际商业集团已成立AI Business&#xff0c;…

亚马逊云科技-如何缩容/减小您的AWS EC2根卷大小-简明教程

一、背景 Amazon EBS提供了块级存储卷以用于 EC2 实例&#xff0c;EBS具备弹性的特点&#xff0c;可以动态的增加容量、更改卷类型以及修改预配置的IOPS值。但是EBS不能动态的减少容量&#xff0c;在实际使用中&#xff0c;用户也许会存在此类场景&#xff1a; 在创建AWS EC2…

mac电脑安装虚拟机教程

1、准备一台虚拟机&#xff0c;安装CentOS7 常用的虚拟化软件有两种&#xff1a; VirtualBoxVMware 这里我们使用VirtualBox来安装虚拟机&#xff0c;下载地址&#xff1a;Downloads – Oracle VM VirtualBox 001 点击安装 002 报错&#xff1a;he installer has detected an…

Linux shell编程学习笔记37:readarray命令和mapfile命令

目录 0 前言1 readarray命令的格式和功能 1.1 命令格式1.2 命令功能1.3 注意事项2 命令应用实例 2.1 从标准输入读取数据时不指定数组名&#xff0c;则数据会保存到MAPFILE数组中2.2 从标准输入读取数据并存储到指定的数组2.3 使用 -O 选项指定起始下标2.4 用-n指定有效行数…

【Filament】绘制圆形

1 前言 Filament环境搭建中介绍了 Filament 的 Windows 和 Android 环境搭&#xff0c;绘制三角形中介绍了绘制纯色和彩色三角形&#xff0c;绘制矩形中介绍了绘制纯色和彩色矩形&#xff0c;本文将使用 Filament 绘制圆形。 2 绘制圆形 本文项目结构如下&#xff0c;完整代码…

Apache Flink(十七):Flink On Standalone任务提交-Standalone Application模式

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

从零开始的神经网络

先决条件 在本文中&#xff0c;我将解释如何通过实现前向和后向传递&#xff08;反向传播&#xff09;来构建基本的深度神经网络。这需要一些关于神经网络功能的具体知识。 了解线性代数的基础知识也很重要&#xff0c;这样才能理解我为什么要在本文中执行某些运算。我最好的…

【FLV】文件解析源码分析:视频解析为可解码的nalu单元

https flv 拉到的数据是flv宏观看 : 每一部分都是 A+ Prev 的模式 A 可以是header :9个字节可以是TAG :大小可变而每个TAG 都有个固定的部分: TAG HEADER ,大小9个字节 ,里面是类型、大小、时间戳、扩展时间戳、流ID 因此,可以直接去掉9+4 个字节的第一部分:FLV HEADER…

凯斯西储大学轴承数据解读

文章目录 一、凯斯西储大学轴承数据基础知识&#xff1f;1.1 故障种类1.2 故障点尺寸&#xff08;单点故障&#xff09;1.3 载荷和转速 二、数据解读2.1 文件2.2 以12k Drive End Bearing Fault Data为例2.3 以&#xff08;0.007&#xff0c;inner race)为例。 3 Normal Baseli…

vivado 关于时钟

关于时钟 在数字设计中&#xff0c;时钟代表了从寄存器可靠传输数据的时间基准注册。AMD Vivado™集成设计环境&#xff08;IDE&#xff09;计时引擎使用时钟计算时序路径要求并通过以下方式报告设计时序裕度的特性松弛计算的方法有关更多信息&#xff0c;请参阅Vivado Design…

杰发科技AC7840——在Eclipse环境下使用Jlink调试

序 杰发给的代码里面已经做代码相关配置&#xff0c;搭建好eclipse环境即可运行&#xff0c;搭建步骤还是比较简单的。 参考文章 如何使用Eclipse搭配JLink来调试HelloWold应用程序&#xff1f;-电子发烧友网 软件链接 杰发科技Eclipse的sample代码里面的doc文章&#xff…

C# .Net学习笔记—— Expression 表达式目录树

一、什么是表达式目录树 &#xff08;1&#xff09;Expression我们称为是表达式树&#xff0c;是一种数据结构体&#xff0c;用于存储需要计算&#xff0c;运算的一种结构&#xff0c;这种结构可以只是存储&#xff0c;而不进行运算。通常表达式目录树是配合Lambda一起来使用的…

关于“Python”的核心知识点整理大全32

目录 12.6.4 调整飞船的速度 settings.py ship.py alien_invasion.py 12.6.5 限制飞船的活动范围 ship.py 12.6.6 重构 check_events() game_functions.py 12.7 简单回顾 12.7.1 alien_invasion.py 12.7.2 settings.py 12.7.3 game_functions.py 12.7.4 ship.py …

Hive入门+部署

看黑马视频做的笔记 目录 概念 1.基本概述 2.基础架构 总架构 部署 1.安装MySQL 2.配置Hadoop 3.下载解压Hive 4.下载MySQL Driver包 注意&#xff01; 5.配置Hive 6.初始化元数据库 7.启动Hive&#xff08;使用Hadoop用户&#xff09; 实例 查看HDFS上表中存…

网络基础【网线的制作、OSI七层模型、集线器、交换机介绍、路由器的配置】

目录 一.网线的制作 1.1.网线的标准 1.2.水晶头的做法 二.OSI七层模型、集线器、交换机介绍 集线器&#xff08;Hub&#xff09;&#xff1a; 交换机&#xff08;Switch&#xff09;&#xff1a; 三.路由器的配置 3.1.使用 3.2.常用的功能介绍 1、如何管理路由器 2、家…

CW32单片机在智能马桶的应用介绍

智能科技的迅速发展使得我们的日常生活变得更加便捷和舒适。智能马桶作为其中一种智能家居产品&#xff0c;通过单片机接受和处理来自传感器的数据&#xff0c;然后通过控制模块对智能马桶的各项功能进行控制&#xff0c;实现对智能马桶的全面控制和调节。本文将介绍CW32单片机…