当前位置:首页 > 科技  > 软件

SpringBoot + Sharding Sphere:轻松搞定数据加解密,支持字段级!

来源: 责编: 时间:2024-07-17 16:55:26 718观看
导读01、故事背景在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号、银行卡号、手机号、工资等信息进行加密存储,实现真正意

01、故事背景

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

那在实际的业务开发过程中,我们如何快速实现呢?ADj28资讯网——每日最新资讯28at.com

今天通过这篇文章,我们一起来了解一下如何在 Spring Boot 中快速实现数据的加解密功能。废话不多说了,直接撸代码!ADj28资讯网——每日最新资讯28at.com

02、方案实践

在 Spring Boot 生态中,有一个非常厉害的开源框架:Apache ShardingSphere。ADj28资讯网——每日最新资讯28at.com

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

如果当前项目是采用 Spring Boot 开发的,可以实现无缝集成,对原系统的改造会非常少。ADj28资讯网——每日最新资讯28at.com

下面以用户表为例,一起了解一下ShardingSphere的数据加解密的实现过程!ADj28资讯网——每日最新资讯28at.com

2.1、创建用户表

首先,在数据库中创建一张用户表,示例脚本如下!ADj28资讯网——每日最新资讯28at.com

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 项目,并添加相关的依赖包,示例如下:ADj28资讯网——每日最新资讯28at.com

<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相关配置,即可实现针对某个表进行脱敏ADj28资讯网——每日最新资讯28at.com

server.port=8080logging.path=log#shardingsphere数据源集成spring.shardingsphere.datasource.name=dsspring.shardingsphere.datasource.ds.type=com.zaxxer.hikari.HikariDataSourcespring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasource.ds.jdbc-url=jdbc:mysql://127.0.0.1:3306/testspring.shardingsphere.datasource.ds.username=xxxxspring.shardingsphere.datasource.ds.password=xxxx#加密方式、密钥配置spring.shardingsphere.encrypt.encryptors.encryptor_aes.type=aesspring.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=truespring.shardingsphere.props.query.with.cipher.column=true#基于xml方法的配置mybatis.mapper-locations=classpath:mapper/*.xml

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

配置示例如下!ADj28资讯网——每日最新资讯28at.com

# 用于告诉 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、编写数据持久层

然后,编写一个数据持久层,用于数据的存储和查询操作。ADj28资讯网——每日最新资讯28at.com

<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、单元测试

最后,我们编写一个单元测试,验证一下代码的正确性。ADj28资讯网——每日最新资讯28at.com

编写启用服务程序ADj28资讯网——每日最新资讯28at.com

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

编写单元测试ADj28资讯网——每日最新资讯28at.com

@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ShardingSphereApplication.class)public class UserTest {    @Autowired    private UserMapperXml userMapperXml;    @Test    public 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);    }    @Test    public void query() throws Exception {        List<UserEntity> dataList = userMapperXml.findAll();        System.out.println(JSON.toJSONString(dataList));    }}

插入数据后,如下图,数据库存储的数据已被加密!ADj28资讯网——每日最新资讯28at.com

我们继续来看看,运行查询服务,结果如下图,数据被成功解密!ADj28资讯网——每日最新资讯28at.com

采用配置方式,最大的好处就是直接通过配置脱敏列就可以完成对某些数据表字段的脱敏,非常方便。ADj28资讯网——每日最新资讯28at.com

三、小结

当需要对某些数据表字段进行脱敏处理的时候,可以采用 Apache ShardingSphere 框架快速实现。ADj28资讯网——每日最新资讯28at.com

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

希望以上的案例,能帮助到大家!ADj28资讯网——每日最新资讯28at.com

想要获取项目源代码的小伙伴,可以通过如下地址获取!ADj28资讯网——每日最新资讯28at.com

https://gitee.com/pzblogs/spring-boot-example-demo

本文链接:http://www.28at.com/showinfo-26-101382-0.htmlSpringBoot + Sharding Sphere:轻松搞定数据加解密,支持字段级!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何利用负载均衡器实现终极自由

下一篇: 新的 HTML &lt;dialog&gt; 标签:绝对改变游戏规则

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • iQOO Neo8系列新品发布会

    旗舰双芯 更强更Pro
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top