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

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

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

  •   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个数字进行分片就可以了,但是不建议

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战案例:缓存不一致问题的解决(redis+本地缓存caffine)

一.问题引入 目前在写项目的时候&#xff0c;在B端查看文章&#xff0c;A端修改文章。为了增加效率&#xff0c;以及防止堆内存溢出&#xff0c;在B端选择本地缓存文章的方案。但是目前出现了A端对文章修改之后&#xff0c;B端读的还是旧数据&#xff0c;出现了缓存不一致的问…

【算法与数据结构】1005、LeetCode K 次取反后最大化的数组和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题允许某个下标的数字多次翻转&#xff0c;因此思路比较简单。首先&#xff0c;我们要求最大和&…

【【迭代七次的CORDIC算法-Verilog实现】】

迭代七次的CORDIC算法-Verilog实现求解正弦余弦函数 COEDIC.v module CORDIC #(parameter DATA_WIDTH 4d8 , // we set data widthparameter PIPELINE 4d8)(input clk ,input …

vivado 关于时钟

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

什么是数据仪表板?数据可视化仪表盘怎么制作?

在数据经济时代&#xff0c;分析数据是每个企业做出最佳决策的关键。但是&#xff0c;手动分析和解释大量数据是不可行的。数据可视化对于分析数据中存在的各种有价值信息至关重要&#xff0c;包括可见趋势和隐藏趋势等。仪表盘显示可视化趋势和信息&#xff0c;例如 KPI、趋势…

Everything 搜索

正则表达式Regex 首先需要开启 Everything 工具在&#xff08;字符串&#xff09;查找时&#xff0c;对正则表达式功能的支持&#xff1a; 需要在【菜单栏】⇒ 【Search】⇒ 勾选【Enable Regex】 查看Everything 支持的语法:

c语言:求算数平均数|练习题

一、题目 输入3个数&#xff0c;求这三个数的算术平均数 二、代码图片【带注释】 三、源代码【带注释】 #include <stdio.h> #include<math.h> //输入正整数a、b、c的值&#xff0c; //求其算术平均值,并保留两个小数位输出 int pass0;//定义一个开关&#xff0c;…

solidity 重入漏洞

目录 1. 重入漏洞的原理 2. 重入漏洞的场景 2.1 msg.sender.call 转账 2.2 修饰器中调用地址可控的函数 1. 重入漏洞的原理 重入漏洞产生的条件&#xff1a; 合约之间可以进行相互间的外部调用 恶意合约 B 调用了合约 A 中的 public funcA 函数&#xff0c;在函数 funcA…

关于“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 …

数据分析基础之《numpy(6)—合并与分割》

了解即可&#xff0c;用panads 一、作用 实现数据的切分和合并&#xff0c;将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […

maven限制内存使用峰值/最大内存

前言 通过设置虚拟机的内存大小&#xff0c;达到限制maven内存使用峰值的效果 方法1&#xff1a;修改mvn脚本 找到mvn脚本在MAVEN_OPTS参数值添加-Xms、-Xmx参数&#xff1a;MAVEN_OPTS"$MAVEN_OPTS -Xms512m -Xmx512m"效果图 windows系统下修改MAVEN_OPTS参数 …

java8实战 lambda表达式、函数式接口、方法引用双冒号(中)

前言 书接上文&#xff0c;上一篇博客讲到了lambda表达式的应用场景&#xff0c;本篇接着将java8实战第三章的总结。建议读者先看第一篇博客 其他函数式接口例子 上一篇有讲到Java API也有其他的函数式接口&#xff0c;书里也举了2个例子&#xff0c;一个是java.util.functi…

重温经典struts1之自定义转换器及注册的两种方式(Servlet,PlugIn)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 Struts的ActionServlet接收用户在浏览器发送的请求&#xff0c;并将用户输入的数据&#xff0c;按照FormBean中定义的数据类型&#xff0c;赋值给FormBean中每个变量&a…

SOME/IP SubscriberEventGroup

1 SOME/IP SubscriberEventGroup SubscriberEventGroup是SOME/IP中的一种服务发现和注册的消息类型,它用于让服务使用者订阅服务提供者的事件组。 事件组是一种将服务的方法和字段分组的方式,它可以让服务使用者只接收感兴趣的数据,而不是所有的数据。 SubscriberEventGrou…

w13渗透测试实战之https账号密码捕抓

此次实验需要配合arp欺骗,不知道arp欺骗的&#xff0c;可以查看这篇w13渗透测试实战之ARP欺骗攻击&#xff08;ARP断网攻击&#xff09; 一、实验环境 攻击机&#xff1a;linux Kali 靶机&#xff1a;window 7 网络环境&#xff1a;虚拟机NAT 网关&#xff1a;192.168.89.2实…

CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem:大屏高宽自适应问题

前言 继上篇《CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem》。 发现一个有趣的问题&#xff0c;文件 rem.js 中按照宽度设置自适应&#xff0c;适用于大多数页面&#xff0c;但当遇到大屏就不那么合适了。 问题 使用宽度&#xff0c;注意代码第2 和 4 行&#xff1a;…

C/C++、Java、Python:主要编程语言的演进与未来趋势

导言 C/C、Java、Python作为主要的编程语言&#xff0c;在软件开发领域扮演着重要角色。本文将深入研究这三者的发展历程、遇到的问题、解决过程&#xff0c;以及未来的可用范围。同时&#xff0c;分析它们之间的联系与区别&#xff0c;探讨哪一门语言可能在未来占据主导地位&a…

OpenCV技术应用(9)— 视频的暂停播放和继续播放

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何控制视频的暂停播放和继续播放&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍…

14:00面试,14:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

13. 从零用Rust编写正反向代理, HTTP中的压缩gzip,deflate,brotli算法

wmproxy wmproxy是由Rust编写&#xff0c;已实现http/https代理&#xff0c;socks5代理&#xff0c; 反向代理&#xff0c;静态文件服务器&#xff0c;内网穿透&#xff0c;配置热更新等&#xff0c; 后续将实现websocket代理等&#xff0c;同时会将实现过程分享出来&#xff…