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

数据库敏感字段脱敏

文章目录

    • 什么是脱敏
    • 脱敏后带来什么问题
      • 解决方案一
      • 解决方案二
    • 具体实施
      • 方案一
      • 方案二
        • 存量数据处理

什么是脱敏

如果你有申请过一些软件资质,应该会被要求敏感数据进行加密,比如密码不能明文,用户的手机号,身份证信息,银行卡号信息,等等都需要以加密的形式放在数据库中,防止因系统漏洞导致被拖库,黑客直接就能拿到这些信息,给用户的人身财产安全带来严重的隐患。
脱敏实际就是加密,这边分为两种类型

  • 不可逆 如密码这种直接采用不可逆的加密方式
  • 可逆的 如手机号,身份证,银行卡这种信息需要密文存储,但是需要时必须能解密。

都讲到这里了我们在多讲点,相对于数据库而言,日志被泄漏的可能性更大,如果你的日志中大量打印了这些信息,也一样泄漏之后会被坏人利用,意味着除了数据库存储上需要做脱敏,日志打印也是要做的。日志打印中可以采用简单暴力的方法,直接屏蔽这些字段输出即可(可以用*号直接代替),不用考虑可逆性。

那么数据在传输的过程中是不是也会出现这种问题呢?答案是肯定的,当你的数据被中间人拦截的时候,一样会泄漏这些数据。所以生产环境我们一定要使用https协议。所以前端发起请求时一般也会要求传输的数据需要加密。不过相对而言此处的数据传输,上的要求没有对日志于数据库存储上来的严格,一般只要求密码做个加密即可。

脱敏后带来什么问题

数据脱敏之后,在数据库存储的就是个密文,那么假如现在有个需求,根据手机号模糊查询。你会发现对于这个密文完全行不通。
那么有没有解决办法呢?

解决方案一

先分词再组合,比如手机号 18850473300,这样一个手机号我们可以将它分段,然后按段进行加密后拼接起来存储,后续接收的模糊查询字段按一样的方式分段,加密然后查询比如分为344手机号可分为188、5047、3300,这个也是有科学依据的,一般人对数字的输入正常情况下都是3-4位数。

解决方案二

使用ShardingSphere 5.3 版本中的CharDigestLikeEncryptAlgorithm 算法进行like查询

具体实施

方案一

扩展mybatis的typeHandler,但是这种方式对业务层有轻微的入侵。个人认为并不是太好。

参考扩展 开源组件原理比较简单我就不介绍了。

方案二

使用ShardingSphere组件,这种方式对业务代码是0入侵

sharding-sphere-4.1.1

ShardingSphere 5.3

这两个地址的文档都可以看看

这个原理是通过代理数据源datasource拦截了sql处理中的prepareStatment阶段,和resultset阶段的处理,在预编译阶段从配置文件查询对应sql中存不存在需要配置的表和字段,如果存在就将对应的参数进行加密,在结果集中对对应的字段进行解密。

以下集成方案采用的是最简单粗暴的方式,当然你也可以使用官方提供的starter集成,只要代理数据源即可,剩下的仅需进行配置。集成起来是非常简单的。

引入依赖

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-core</artifactId><version>4.0.1</version></dependency>

做个简单的配置抽取

@ConfigurationProperties(prefix = "user")
@Data
public class UserProperties {private Datasource datasource;private Encrypt encrypt;@Datapublic static class Datasource {private String type;private String driverClassName;private String url;private String username;private String password;}@Datapublic static class Encrypt {//key=table , value=columnsprivate Map<String, List<String>> tableFields;private String aesSecret;}
}
@Configuration
@EnableConfigurationProperties(UserProperties.class)
@MapperScan(basePackages = "com.xxx.xxx.xxx.mapper.user",sqlSessionFactoryRef = "userSqlSessionFactory")
public class UserDataSourceConfiguration {@Bean("userSqlSessionFactory")SqlSessionFactory sqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource,ObjectProvider<Interceptor[]> plugins)throws Exception {MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();sqlSessionFactoryBean.setVfs(SpringBootVFS.class);sqlSessionFactoryBean.setDataSource(dataSource);sqlSessionFactoryBean.setPlugins(plugins.getIfAvailable());sqlSessionFactoryBean.setTypeAliasesPackage("com.xxx.xxx.xxx.entity.user");ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();sqlSessionFactoryBean.setMapperLocations(resourceResolver.getResources("classpath:sql/user/**/*Mapper.xml"));return sqlSessionFactoryBean.getObject();}@Bean("userDataSource")public DataSource dataSource(UserProperties properties) throws SQLException {HikariDataSource dataSource = new HikariDataSource();dataSource.setDriverClassName(properties.getDatasource().getDriverClassName());dataSource.setJdbcUrl(properties.getDatasource().getUrl());dataSource.setUsername(properties.getDatasource().getUsername());dataSource.setPassword(properties.getDatasource().getPassword());// 配置脱敏规则Properties props = new Properties();props.setProperty("aes.key.value", properties.getEncrypt().getAesSecret());EncryptorRuleConfiguration encryptorConfig = new EncryptorRuleConfiguration("AES", props);// 配置脱敏规则EncryptRuleConfiguration config = new EncryptRuleConfiguration();this.setEncryptRuleConfiguration(config, encryptorConfig, properties);// 获取数据源对象return EncryptDataSourceFactory.createDataSource(dataSource, config, new Properties());}public void setEncryptRuleConfiguration(EncryptRuleConfiguration encryptRuleConfig,EncryptorRuleConfiguration encryptorConfig, UserProperties properties) {properties.getEncrypt().getTableFields().forEach((tables, fieldList) -> {Map<String, EncryptColumnRuleConfiguration> columns = Maps.newHashMap();fieldList.forEach(field -> {//字段配置EncryptColumnRuleConfiguration columnConfig = new EncryptColumnRuleConfiguration("",field, "", "aes");columns.put(field, columnConfig);//解密方式encryptRuleConfig.getEncryptors().put("aes", encryptorConfig);});//字段对应字段配置EncryptTableRuleConfiguration tableConfig = new EncryptTableRuleConfiguration(columns);//表encryptRuleConfig.getTables().put(tables, tableConfig);});}
}

配置文件

user:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/user?serverTimezone=GMT%2B8&autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=falseusername: rootpassword: rootencrypt:aes-secret: "hahahahhah"    # aes密钥tableFields:                #加密字段配置           u_user:                   # 表   - user_account          #表下的字段 - mobile- id_no- id_addressu_enterprise:                             #另一张表- bank_card_no                          #另一张表的字段- business_license_no

存量数据处理

当然不管那种方案下,如果你是从0开始那么直接配置即可,如果你已有存量数据,那么你需要对这些存量数据进行清洗,也就是存量数据你先得写个接口先进行加密,不然直接跑起来会出错,当然你也可以采用官方文档提供的方案,使用辅组字段。个人感觉没什么必要,这种东西又不会经常变来变去的。

相关文章:

数据库敏感字段脱敏

文章目录什么是脱敏脱敏后带来什么问题解决方案一解决方案二具体实施方案一方案二存量数据处理什么是脱敏 如果你有申请过一些软件资质&#xff0c;应该会被要求敏感数据进行加密&#xff0c;比如密码不能明文&#xff0c;用户的手机号&#xff0c;身份证信息&#xff0c;银行…...

skynet 游戏服务器探索(1)--熟悉skynet(网络)

因为做游戏服务器开发&#xff0c;大多数都跟脚本打交道&#xff0c;要么是lua,要么是python,要么是php,方便热更新的只有lua与php, php相关的游戏服务器开发&#xff0c;参考我另外的文章https://blog.csdn.net/guoyilongedu/article/details/121049511lua脚本相关的&#xff…...

select、poll、epoll

select、poll、epoll select int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); int nfds&#xff1a;被select管理的文件描述符的个数&#xff0c;最大描述符编号1fd_set *readfds&#xff1a;读文件描述符集合fd_se…...

rollup的基本使用 基本配置与处理各种文件

rollup rollup是一个javascript的模块化打包工具 可以帮助我们编译小的代码到一个大的负载的代码中 比如一个库或者一个应用 rollup与webpack的区别 rollup主要针对ES Module进行打包 另外webpack通常可以通过各种loader处理各种各样的文件 以及处理他们的依赖关系 rollup更多…...

ubuntu-debian系-redhat系

debian系 包类型&#xff1a;.deb包 本地安装包安装工具&#xff1a;dpkg 本地包管理命令&#xff1a;dpkg -i package 安装包 dpkg -r package 卸载包 dpkg -l package 查看已安装包 远程安装包安装工具&#xff1a;apt / apt-get 远程包管理命令&#xff1a;apt-get apt-cac…...

Altium Designer 18中原理图DRC编译和PCB DRC检查-AD DRC

一、原理图编译 原理图检查的主要内容有&#xff1a; 1、元件位号冲突。也即多个元件编号相同&#xff0c;例如两个电容在原理图中都被命名为C2&#xff0c;显然肯定是无法生成PCB的。 2、网络悬浮。也即网络标号没有附着在电气走线上&#xff0c;一般这种是人操作失误&…...

zipfile — 访问 ZIP 压缩文件

zipfile — 访问 ZIP 压缩文件 1.概述 zipfile 模块可用于操作 ZIP 存档文件&#xff0c;.zip 是 PC 程序 PKZIP 推广的格式 2.测试数据 为了演示用&#xff0c;你需要创建以下三个文件 1.README.txt 内容如下&#xff0c;注意最后一行为空行 The examples for the zipfil…...

检查nmos管是否损坏

NCEP85T14 功率mos管为例 以NMOS举例&#xff0c;只用万用表二极管档测量MOS管的好坏-电子发烧友网 NMOS的D极和S极之间有一个寄生二极管&#xff0c;方向为S到D&#xff0c;利用二极管单向导电性以及MOS管导通时寄生二极管截止的特性&#xff0c;可以快速测量MOS好坏。 1、测…...

第七章 - 聚合函数(count,avg,sum,max,min)和一些数学函数

第七章 - 聚合函数使用别名 ascount() 计数avg() 平均值sum() 求和max() 最大值min() 最小值一些数学计算函数Abs()Cos()Exp()Mod()Pi()radians()Sin()Sqrt()Power()Ceil()Floor()使用别名 as 在SQL中可以使用 as 来为一个字段或者一个值设置新的别名下面聚合函数的使用中就会…...

Typescript的原始据类型和Any类型

最新的ECMAScript标准定义了8中数据类型: 7种原始类型&#xff1a; BooleanNullUndefinedNumberBigintStringSymbol和 Object 除 Object 以外的所有类型都是不可变的 (值本身无法被改变》。例如&#xff0c;与C语言不同JavaScript 中字符串是不可变的 (译注: 如&#xff0c;Ja…...

[python入门㊼] - python类的高级函数

目录 ❤ 类的高级函数 ❤ __str__ ❤ __getattr__ ❤ __setattr__ ❤ __call__ ❤ 类的高级函数 今天来为大家介绍几个类中的高级函数&#xff0c;它们也是类中的内置函数。通过使用它们&#xff0c; 会让我们在进行类开发的时候更加的顺手&#xff0c;接下来我们就…...

【Windows】使用Fiddler 工具对手机进行接口监听

目录 工具下载 配置Fidder 手机端获取证书 过滤指定接口 工具下载 CSDN下载地址 其他下载地址 配置Fidder 安装后&#xff0c;打开进入如下界面 在fiddler菜单项选择Tools -> Options -> HTTPS 勾选【Decrypt HTTPS traffic 】 下拉框默认&#xff1a;【from al…...

SpringCloudAlibab-nacos

一、介绍注册中心配置中心的整合SpringCloudAlibaba中文地址&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.md下载地址&#xff1a;https://github.com/alibaba/nacos/访问&#xff1a;http://localhost:8848/nacos/二、使用1、添加依赖&…...

从一致性角度考虑推荐冷启动长尾推荐问题(二)

前言&#xff1a;在推荐系统中user&item emb往往是最重要的特征之一&#xff0c;在冷启动和长尾优化的工作中&#xff0c;往往也是优化的重点&#xff0c;相当一部分工作是围绕着emb优化展开&#xff0c;所以这里单独开了一章。4)emb分布一致性主要思路在于冷启内容emb和高…...

电脑c盘满了怎么清理,c盘空间清理

电脑c盘满了怎么清理&#xff1f;电脑C盘满了可能是因为您的操作系统、程序文件、下载文件、临时文件、垃圾文件等占用了太多的存储空间。所以&#xff0c;我们就需要进行一些操作和清理。 一.清理电脑C盘的方法 清理临时文件和垃圾文件。在Windows上&#xff0c;您可以使用系…...

vite的基本使用

vite 浏览器原生支持模块化 浏览器原生加载的缺点 1.必须明确的写上后缀名 2.如果某一个模块 加载跟多其他的js文件 那么这些js文件都需要被依次加载 浏览器需要将所有的js文件请求下来 发送跟多的http请求&#xff08;效率也是非常低的&#xff09; 3.如果代码中由typescrip…...

JavaScript 字符串(String) 对象

JavaScript 是一种流行的编程语言&#xff0c;可以用于开发各种 Web 应用程序和移动应用程序。在 JavaScript 中&#xff0c;字符串是一种非常常见的数据类型&#xff0c;可以使用 JavaScript 字符串&#xff08;String&#xff09;对象来处理。本文将详细介绍 JavaScript 字符…...

小知识点:Mac M1/M2 VMware Fusion 安装 Centos 7.9(ARM 64 版本)

最近换了 Mac M2 芯片的笔记本&#xff0c;用原来的 Centos 镜像安装虚拟机直接报错 “无法打开此虚拟机的电源&#xff0c;因为它需要使用 X86 计算机架构&#xff0c;而该架构与此 Arm 计算机架构主机不兼容。” 安装流程前置一、下载镜像二、安装虚拟机三、配置静态 IP四、安…...

Nginx 新增模块 http_image_filter_module 来实现动态生成缩略图

前言 通过 nginx 的 HttpImageFilterModule 模块裁剪过大的图片到指定大小&#xff0c;这个nginx自带的模块是默认关闭的&#xff0c;所以需要重新编译nginx加上此模块。 一、编译 nginx 1.查看 nginx 模块 由于nginx 是之前装好的&#xff0c;这里需要先看一下是否安装了H…...

detach,主线程终止后子线程会结束吗

此前&#xff0c;我对detach的理解是&#xff0c;当主线程退出后&#xff0c;子线程能够继续存在。实际上&#xff0c;当主线程退出后&#xff0c;子线程也随之结束了。先看一个例子&#xff1a; #include <iostream> #include <thread> #include <unistd.h>…...

2023年云计算的发展趋势如何?还值得学习就业吗?

一、2023年云计算的发展将迎来新篇章 随着政策的正式放开&#xff0c;2023年的经济开始慢慢复苏&#xff0c;云计算在疫情期间支撑了复工复产&#xff0c;那么在今年对于云计算发展的限制将进一步的放开。Gartner的数据显示&#xff0c;到2023年&#xff0c;全球公共云支出将达…...

ROS2 入门应用 请求和应答(C++)

ROS2 入门应用 请求和应答&#xff08;C&#xff09;1. 创建功能包2. 创建源文件2.1. 服务端2.2. 客户端3. 添加依赖关系4. 添加编译信息4.1. 添加搜索库4.2. 增加可执行文件4.3. 增加可执行文件位置5. 编译和运行1. 创建功能包 在《ROS2 入门应用 工作空间》中已创建和加载了…...

华为机试题:HJ73 计算日期到天数转换(python)

文章目录博主精品专栏导航知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() &#xff1a;打印输出。3、整型int() &#xff1a;将指定进制&#xf…...

将springboot项目生成可依赖的jar,并引入到项目中

1、将springboot项目生成可依赖的jar包的方法 SpringBoot项目默认打包的是可运行jar包&#xff0c;也可以打包成不可运行的jar包。 能打成可运行的jar包是因为&#xff0c;Spring Boot 项目引入了 spring-boot-maven-plugin 依赖包。 spring-boot-maven-plugin具有repackage …...

小红书搜索关键词布局指南,这4种词一定要把握好

在小红书搜索关键词布局&#xff0c;是提升搜索推流的重要方法&#xff0c;今天跟你讲清楚小红书搜索关键词布局怎么做&#xff5e;做小红书的都知道&#xff0c;小红书的主要流量来源一个是推荐&#xff0c;另一个就是搜索&#xff0c;关键词决定了你的精准人群&#xff0c;那…...

安全研发人员能力模型窥探

能力 是一个比较抽象的概念&#xff0c;不同的行业、管理者、研发人员对能力的认知都会有差异。另外&#xff0c;作为研发团队的相应的职级定级、绩效考核的基础&#xff0c;一个“大家普遍认可”的能力的模型是非常重要的。这是比职级模型更高层的一个基本模型&#xff0c;所谓…...

【面试总结】Linux篇·操作及原理篇

【面试总结】Linux篇原理篇1.介绍一下inode2.说一下Linux系统的目录结构3.说一下Linux系统的文件类型4.如何在Linux上配置一个IP地址5.Linux负载是什么&#xff1f;6.Linux中的软链接和硬链接有什么区别&#xff1f;1.介绍一下inode 硬盘的最小存储单位是扇区(Sector)&#xf…...

C++中如何实现用异或运算找出数组中只出现一次的数字???

文章目录1、异或运算符的运算1、异或运算符的运算 问题描述&#xff1a; 给出一个指定的数组&#xff0c;只有一个数出现一次&#xff0c;剩下都出现两次&#xff0c;找出出现一次的数字。指定数组为[1,2,2,1,3,4,3]。 样例输出&#xff1a;4 #include<iostream> using…...

红黑树的历史和由来。

一个数组&#xff0c;1,2,3,4,5,...n; 一共n个数字。1、直接查找想要查询第n个数字&#xff0c;直接搜索&#xff0c;就是n次查询。ps:那么问题来了&#xff0c;这样查询也太慢了&#xff0c;有什么改进的呢&#xff1f;2、二分查找这个时候&#xff0c;二分查找更快。不过就是…...

蓝库云|制造业数字化转型为何转不动?资料处理很重要

数字化转型已经成为每个产业势在必行的课题&#xff0c;没有人会怀疑数字化技术与科技能解放的生产力能量&#xff0c;但为什么看似美好的愿景&#xff0c;实行起来却如此缓慢&#xff1f;蓝库云认为这是因为没有盖好「资料治理」的地基。 面对不断变化的法令规范要求&#xf…...

建设银行在上海的招聘网站/推广方式营销方案

20&#xff09;&#xff1a;题目&#xff1a;猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不瘾&#xff0c;又多吃了一个第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。…...

宁夏企业网站建设/临沂网站建设

1. 相对定位 relative&#xff1a;定位是相对于自身位置定位&#xff08;设置偏移量的时候&#xff0c;会相对于自身所在的位置偏移&#xff09;。设置了relative的元素仍然处在文档流中&#xff0c;元素的宽高不变&#xff0c;设置偏移量也不会影响其他元素的位置。最外层容器…...

天津企业网站制作/关键词查询的五种常用工具

满意答案叶丹181546推荐于 2016.12.02采纳率&#xff1a;50% 等级&#xff1a;11已帮助&#xff1a;10824人对味黑人说唱&#xff1a;歌名&#xff1a; 歌手&#xff1a;Fuck You Cash MoneyHands Up ChingyLookin At You The GameToo Much The GameGangsta Rap Made Me Do …...

网络信息设计/网站的seo是什么意思

介意女朋友学历低吗在最近的精益咖啡回顾中&#xff0c;我们团队的每个成员都被要求提出一个有关工作环境的问题或担忧。 对我来说&#xff0c;我最迫切的问题是我们应该介意其他事务。 在表达了我的担忧之后&#xff0c;我的团队做出了微妙的回应&#xff0c;因为人们对于表达…...

2015做哪些网站能致富/网络推广怎么做才有效

GPU显存管理 GPU&#xff1a;有两种方式访问GDDR5&#xff0c;一种是HUB统一接口进行分配&#xff0c;另一种是直接调Controller&#xff0c;比如Depth block&#xff0c;color block&#xff0c;texture block等都是直接Controller。直接调用的方式肯定快一些&#xff0c;我觉…...

自己做网站需要花钱吗/网站关键词排名优化价格

319个团队、480人参赛&#xff0c;第三届华为云VR开发应用大赛盛况空前&#xff0c;而新设立的“人气数字人形象奖”“人气虚拟偶像奖”等&#xff0c;让大赛又一次“破圈”&#xff0c;人气直升。通过大赛&#xff0c;我们看到虚拟现实、数字人、元宇宙等正“脱虚向实”&#…...