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

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

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

01、故事背景

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

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

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

02、方案实践

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

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

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

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

2.1、创建用户表

首先,在数据库中创建一张用户表,示例脚本如下!kvw28资讯网——每日最新资讯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 项目,并添加相关的依赖包,示例如下:kvw28资讯网——每日最新资讯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相关配置,即可实现针对某个表进行脱敏kvw28资讯网——每日最新资讯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指的是脱敏列,如果是新工程,只需要配置脱敏列即可!kvw28资讯网——每日最新资讯28at.com

配置示例如下!kvw28资讯网——每日最新资讯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、编写数据持久层

然后,编写一个数据持久层,用于数据的存储和查询操作。kvw28资讯网——每日最新资讯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、单元测试

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

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

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

编写单元测试kvw28资讯网——每日最新资讯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));    }}

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

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

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

三、小结

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

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

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

想要获取项目源代码的小伙伴,可以通过如下地址获取!kvw28资讯网——每日最新资讯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; 标签:绝对改变游戏规则

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 机构称Q2全球智能手机出货量同比下滑11% 苹果份额依旧第2

    7月20日消息,据外媒报道,研究机构的报告显示,由于需求下滑,今年二季度全球智能手机的出货量,同比下滑了11%,三星、苹果等主要厂商的销量,较去年同期均有下
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top