SpringBoot+ Sharding Sphere 轻松实现数据库字段加解密

一、介绍

在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号、银行卡号、手机号、工资等信息进行加密存储,实现真正意义的数据混淆脱敏,以满足信息安全的需要。

那在实际的业务开发过程中,我们如何快速实现呢?

今天通过这篇文章,我们一起来了解一下如何在 Spring Boot 中快速实现数据的加解密功能。废话不多说了,直接撸代码!

二、方案实践

在 Spring Boot 生态中,有一个非常厉害的开源框架:Apache ShardingSphere。

它是一款分布式 SQL 事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。我们可以利用它的数据脱敏模块,快速实现 SQL 字段的加解密操作。

如果当前项目是采用 Spring Boot 开发的,可以实现无缝集成,对原系统的改造会非常少。

下面以用户表为例,一起了解一下ShardingSphere的数据加解密的实现过程!

2.1、创建用户表

首先,在数据库中创建一张用户表,示例脚本如下!

CREATE TABLE user (id bigint(20) NOT NULL COMMENT '用户ID',email varchar(255)  NOT NULL DEFAULT '' COMMENT '邮件',nick_name varchar(255)  DEFAULT NULL COMMENT '昵称',pass_word varchar(255)  NOT NULL DEFAULT '' COMMENT '二次密码',reg_time varchar(255)  NOT NULL DEFAULT '' COMMENT '注册时间',user_name varchar(255)  NOT NULL DEFAULT '' COMMENT '用户名',salary varchar(255) DEFAULT NULL COMMENT '基本工资',PRIMARY KEY (id) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
2.2、创建 springboot 项目并添加依赖包

接着,创建一个 Spring Boot 项目,并添加相关的依赖包,示例如下:

<dependencies><!--spring boot核心--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--spring boot 测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--springmvc web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysql 数据源--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis 支持--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version></dependency> <!--shardingsphere数据分片、脱敏工具--><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-namespace</artifactId><version>4.1.0</version></dependency>
</dependencies>
2.3、添加相关配置

application.properties文件中,添加shardingsphere相关配置,即可实现针对某个表进行脱敏

server.port=8080logging.path=log#shardingsphere数据源集成
spring.shardingsphere.datasource.name=ds
spring.shardingsphere.datasource.ds.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds.jdbc-url=jdbc:mysql://127.0.0.1:3306/test
spring.shardingsphere.datasource.ds.username=xxxx
spring.shardingsphere.datasource.ds.password=xxxx#加密方式、密钥配置
spring.shardingsphere.encrypt.encryptors.encryptor_aes.type=aes
spring.shardingsphere.encrypt.encryptors.encryptor_aes.props.aes.key.value=hkiqAXU6Ur5fixGHaO4Lb2V2ggausYwW
#plainColumn表示明文列,cipherColumn表示脱敏列
spring.shardingsphere.encrypt.tables.user.columns.salary.plainColumn=
spring.shardingsphere.encrypt.tables.user.columns.salary.cipherColumn=salary
#spring.shardingsphere.encrypt.tables.user.columns.pass_word.assistedQueryColumn=
spring.shardingsphere.encrypt.tables.user.columns.salary.encryptor=encryptor_aes#sql打印
spring.shardingsphere.props.sql.show=true
spring.shardingsphere.props.query.with.cipher.column=true#基于xml方法的配置
mybatis.mapper-locations=classpath:mapper/*.xml

其中有几个的配置信息比较重要,spring.shardingsphere.encrypt.tables是指要脱敏的表,user是表名,salary表示user表中的真实列,其中plainColumn指的是明文列,cipherColumn指的是脱敏列,如果是新工程,只需要配置脱敏列即可!

配置示例如下!

# 用于告诉 ShardingSphere 数据表里哪个列用于存储明文数据
spring.shardingsphere.encrypt.tables.user.columns.salary.plainColumn=
# 用于告诉 ShardingSphere 数据表里哪个列用于存储密文数据
spring.shardingsphere.encrypt.tables.user.columns.salary.cipherColumn=salary
# 用于告诉 ShardingSphere 数据表里哪个列用于存储辅助查询数据
#spring.shardingsphere.encrypt.tables.user.columns.salary.assistedQueryColumn=
# 用于告诉 ShardingSphere 数据表里哪个列使用什么算法加解密
spring.shardingsphere.encrypt.tables.user.columns.salary.encryptor=encryptor_aes
2.4、编写数据持久层

然后,编写一个数据持久层,用于数据的存储和查询操作。

<mapper namespace="com.example.shardingsphere.mapper.UserMapperXml" ><resultMap id="BaseResultMap" type="com.example.shardingsphere.entity.UserEntity" ><id column="id" property="id" jdbcType="BIGINT" /><result column="email" property="email" jdbcType="VARCHAR" /><result column="nick_name" property="nickName" jdbcType="VARCHAR" /><result column="pass_word" property="passWord" jdbcType="VARCHAR" /><result column="reg_time" property="regTime" jdbcType="VARCHAR" /><result column="user_name" property="userName" jdbcType="VARCHAR" /><result column="salary" property="salary" jdbcType="VARCHAR" /></resultMap><select id="findAll" resultMap="BaseResultMap">SELECT * FROM user</select><insert id="insert" parameterType="com.example.shardingsphere.entity.UserEntity">INSERT INTO user(id,email,nick_name,pass_word,reg_time,user_name, salary)VALUES(#{id},#{email},#{nickName},#{passWord},#{regTime},#{userName}, #{salary})</insert>
</mapper>
public interface UserMapperXml {/*** 查询所有的信息* @return*/List<UserEntity> findAll();/*** 新增数据* @param user*/void insert(UserEntity user);
}
public class UserEntity {private Long id;private String email;private String nickName;private String passWord;private String regTime;private String userName;private String salary;//省略set、get...}
2.5、单元测试

最后,我们编写一个单元测试,验证一下代码的正确性。

编写启用服务程序

@SpringBootApplication
@MapperScan("com.example.shardingsphere.mapper")
public class ShardingSphereApplication {public static void main(String[] args) {SpringApplication.run(ShardingSphereApplication.class, args);}
}

编写单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ShardingSphereApplication.class)
public class UserTest {@Autowiredprivate UserMapperXml userMapperXml;@Testpublic void insert() throws Exception {UserEntity entity = new UserEntity();entity.setId(3l);entity.setEmail("123@123.com");entity.setNickName("阿三");entity.setPassWord("123");entity.setRegTime("2021-10-10 00:00:00");entity.setUserName("张三");entity.setSalary("2500");userMapperXml.insert(entity);}@Testpublic void query() throws Exception {List<UserEntity> dataList = userMapperXml.findAll();System.out.println(JSON.toJSONString(dataList));}
}

插入数据后,如下图,数据库存储的数据已被加密!

我们继续来看看,运行查询服务,结果如下图,数据被成功解密!

采用配置方式,最大的好处就是直接通过配置脱敏列就可以完成对某些数据表字段的脱敏,非常方便。

三、小结

当需要对某些数据表字段进行脱敏处理的时候,可以采用 Apache ShardingSphere 框架快速实现。

但是有个细节很容易遗漏,那就是字段类型,例如salary字段,根据常规,很容易想到使用数字类型,但是却不是,要知道加密之后的数据都是一串乱码,数字类型肯定是无法存储字符串的,因此在定义的时候,这个要留心一下。

希望以上的案例,能帮助到大家!

示例代码:spring-boot-example-shardingsphere

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

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

相关文章

优选算法之二分查找(上)

目录 一、二分查找 1.题目链接&#xff1a;704. 二分查找 2.题目描述&#xff1a; 3.算法流程&#xff1a; 4.算法代码&#xff1a; 二、在排序数组中查找元素的第一个和最后一个位置 1.题目链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 2.题目描述…

matlab2018b安装

1.可先参考这个 2.激活 按上面教程安装后&#xff0c;打开matlab 可能会出现软件激活这个界面&#xff0c;需要按如下步骤进行操作。

从理论到实践:如何用 TDengine 打造完美数据模型​

在用 TDengine 进行数据建模之前&#xff0c;我们需要回答两个关键问题&#xff1a;建模的目标用户是谁&#xff1f;他们的具体需求是什么&#xff1f;在一个典型的时序数据管理方案中&#xff0c;数据采集和数据应用是两个主要环节。如下图所示&#xff1a; 对于数据采集工程师…

Bootstrap5 Navbar多级下拉框

实现目标&#xff1a; 1、访问 Bootstrap5-navbar 2、修改dropdown为多级 <!DOCTYPE HTML> <html lang"en-US"> <head><meta charset"UTF-8"><title></title><link rel"stylesheet" href"https…

Unity DOTS中的world

Unity DOTS中的world 注册销毁逻辑自定义创建逻辑创建world创建system group插入player loopReference DOTS中&#xff0c;world是一组entity的集合。entity的ID在其自身的世界中是唯一的。每个world都拥有一个EntityManager&#xff0c;可以用它来创建、销毁和修改world中的en…

[AWS]MSK调用,报错Access denied

背景&#xff1a;首先MSK就是配置一个AWS的托管 kafka&#xff0c;创建完成之后就交给开发进行使用&#xff0c;开发通常是从代码中&#xff0c;编写AWS的access_key 和secret_key进行调用。 但是开发在进行调用的时候&#xff0c;一直报错连接失败&#xff0c;其实问题很简单&…

【机器学习】机器学习之计算学习理论--评估机器学习能够学到什么程度

引言 计算学习理论&#xff08;Computational Learning Theory&#xff0c;CLT&#xff09;是机器学习的一个分支&#xff0c;它使用数学工具来分析和理解机器学习算法的效率和可能性 计算学习理论主要关注三个核心问题&#xff1a;学习模型的表示、学习算法的效率和学习的泛化…

Matlab画不同指标的对比图

目录 一、指标名字可修改 二、模型名字可修改 三、输入数据可修改 软件用的是Matlab R2024a。 clear,clc,close all figure1figure(1); % set(figure1,Position,[300,100,800,600],Color,[1 1 1]) axes1 axes(Parent,figure1);%% Initialize data points 一、指标名字可修…

Astro 4.12 发布,新增支持服务器岛屿

近日&#xff0c;Astro 发布了最新的 4.12 版本&#xff0c;此版本包含 Server Islands&#xff08;服务器岛屿&#xff09;&#xff0c;这是 Astro 将高性能静态 HTML 和动态服务器生成的组件集成在一起的新解决方案&#xff0c;此版本还包括对分页和语法突出显示的改进。 要…

如何检查我的网站是否支持HTTPS

HTTPS是一种用于安全通信的协议&#xff0c;是HTTP的安全版本。HTTPS的主要作用在于为互联网上的数据传输提供安全性和隐私保护。通常是需要在网站安装部署SSL证书来实现网络数据加密传输&#xff0c;安全加密功能。 那么如果要检查你的网站是否支持HTTPS&#xff0c;可以看下…

C#基于SkiaSharp实现印章管理(4)

前几篇文章实现了绘制不同外形印章的功能&#xff0c;印章内部一般包含圆形、线条等形状&#xff0c;有些印章内部还有五角星&#xff0c;然后就是各种样式的文字。本文实现在印章内部绘制圆形、线条、矩形、椭圆等四种形状。   定义FigureType枚举记录印章内部形状&#xff…

数据结构——堆(C语言版)

树 树的概念&#xff1a; 树&#xff08;Tree&#xff09;是一种抽象数据结构&#xff0c;它由节点&#xff08;node&#xff09;的集合组成&#xff0c;这些节点通过边相连&#xff0c;把 节点集合按照逻辑顺序抽象成图像&#xff0c;看起来就像一个倒挂着的树&#xff0c;也…

react入门到实战-day1

这react门课我是学习b站黑马的课程&#xff0c;不是打公告哈&#xff0c;我只是过一遍&#xff0c;让自己对学过的知识有印象&#xff0c;所以笔记是有很大部分直接复制总结过来的&#xff0c;方便后面的我进行复习。如有冒犯&#xff0c;联系必删 React介绍以及创建方式 React…

基于FPGA的以太网设计(2)----以太网的硬件架构(MAC+PHY)

1、概述 以太网的电路架构一般由MAC、PHY、变压器、RJ45和传输介质组成,示意图如下所示: 需要注意的是,上图是一个简化了的模型,它描述的是两台主机之间的直接连接,但在实际应用中基本都是多台主机构成的局域网,它们之间并不直接相连,而是通过交换机Switch来进行…

JAVA开发工具IDEA如何连接操作数据库

一、下载驱动 下载地址&#xff1a;【免费】mysql-connector-j-8.2.0.jar资源-CSDN文库 二、导入驱动 鼠标右击下载到IDEA中的jar包&#xff0c;选择Add as Library选项 如图就导入成功 三、加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 四、驱动管理…

FPGA开发在verilog中关于阻塞和非阻塞赋值的区别

一、概念 阻塞赋值&#xff1a;阻塞赋值的赋值号用“”表示&#xff0c;对应的是串行执行。 对应的电路结构往往与触发沿没有关系&#xff0c;只与输入电平的变化有关系。阻塞赋值的操作可以认为是只有一个步骤的操作&#xff0c;即计算赋值号右边的语句并更新赋值号左边的语句…

软件缺陷(Bug)、禅道

目录 软件缺陷的判定标准 软件缺陷的核心内容 构成缺陷的基本要素 缺陷报告 缺陷管理 缺陷的跟踪流程 项目管理工具--禅道 软件在使用过程中存在的任何问题&#xff08;如&#xff1a;错误、异常等&#xff09;&#xff0c;都叫软件的缺陷&#xff0c;简称bug。 软件缺…

学习记录--Bert、Albert、RoBerta

目录 Bert 1&#xff1a;输入 2&#xff1a;Bert结构 3&#xff1a;模型预训练 Albert 1&#xff1a;SOP任务 2&#xff1a;embedding因式分解 3&#xff1a;参数共享 RoBerta 参考&#xff1a; BERT原理和结构详解_bert结构-CSDN博客 [LLM] 自然语言处理 --- ALBER…

鸿蒙华为登录(以及导航页面跳转)

//登录华为登录界面以及跳转 //切记一定要写路径&#xff0c;不写路径&#xff0c;容易报错&#xff0c;还有一定要记得导一下包&#xff08;Arouter&#xff09; //接下来是鸿蒙界面导航跳转 //进行跳转 TabContent组件不支持设置通用宽度属性&#xff0c;其宽度默认撑满Tab…

在spyder中使用arcgis pro的包

历时2天终于搞定了 目标&#xff1a;在anconda中新建一个arcpyPro环境&#xff0c;配置arcgispro3.0中的arcpy 一、安装arcgispro3.0 如果安装完之后打开arcgispro3.0闪退&#xff0c;就去修改注册表&#xff08;在另一台电脑安装arcgispro遇到过&#xff09; 安装成功后可…