首页 > 数据库 >SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文

SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文

时间:2023-07-15 17:45:34浏览次数:40  
标签:jdbc SpringBoot 加解密 查询 Sphere user 密文 true name

场景

为防止数据泄露,需要在插入等操作时将某表的字段在数据库中加密存储,在需要查询使用时明文显示。

Sharding Sphere

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,

它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。

 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生

等各种多样化的应用场景。

ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,

而并非实现一个全新的关系型数据库。 它与NoSQL和NewSQL是并存而非互斥的关系。

NoSQL和NewSQL作为新技术探索的前沿,放眼未来,拥抱变化,是非常值得推荐的。

数据脱敏只是其中一个模块,下面是官方文档说明。

https://shardingsphere.apache.org/document/legacy/4.x/document/cn/manual/sharding-jdbc/usage/encrypt/

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、新建SpringBoot项目并引入依赖

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>

2、修改yml配置文件中原数据源配置为shardingsphere并进行加密等相关规则配置

修改前的数据源配置

# 数据源
spring:
  application:
    name: apiDataDesensitizationDemo
  datasource:
   url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    dbcp2:
      min-idle: 5                                # 数据库连接池的最小维持连接数
      initial-size: 5                            # 初始化连接数
      max-total: 5                               # 最大连接数
      max-wait-millis: 150                       # 等待连接获取的最大超时时间

修改后的数据源配置

# 数据源
spring:
  application:
    name: apiDataDesensitizationDemo
  shardingsphere:
    datasource:
      names: ds0
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
       jdbc-url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456

添加加密相关规则配置

# 数据源
spring:
  application:
    name: apiDataDesensitizationDemo
  shardingsphere:
    datasource:
      names: ds0
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
       jdbc-url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456

    encrypt:
      tables:
        t_user:
          columns:
            name:
              #plainColumn: pwd_plain
              cipherColumn: name
              encryptor: pwdEncrypt
      encryptors:
        pwdEncrypt:
          type: AES
          props:
            aes:
              key:
                value: 123456
    props:
      query:
        with:
          cipher:
            column: true #是否使用密文列查询,false 则查询时返回密文,true则查询时返回明文

注意这里的配置文件中,表示要对t_user表的name属性进行加密,并且指定密文存储列也为name,

如果需要存储明文,则放开配置plainColumn。

后面是指定加密器,以及类型为自带的AES,秘钥为123456。

后面的配置#是否使用密文列查询,false 则查询时返回密文,true则查询时返回明文

3、新建测试表t_user

 

然后根据此表生成各层代码,此处省略。

只附实体类代码

@Data
public class User implements Serializable {

    private static final long serialVersionUID = -5514139686858156155L;

    private Integer id;

    private Integer userId;

    private String name;

    private Integer age;

}

4、新建controller进行测试查询和查询

@RequestMapping("user")
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("save")
    public String save() {
        User user = new User();
        user.setUserId(new Random().nextInt( 1000 ) + 1);
        user.setName("张三"+user.getUserId());
        user.setAge(new Random().nextInt( 80 ) + 1);
        userService.insert(user);
        return "save success";
    }

    @RequestMapping("findAll")
    public String findAll() {
        List<User> all = userService.findAll();
        return all.toString();
    }

}

启动并测试插入,结果如上图,数据库中存储为密文。

然后调用查询,当上面的配置为true时,此时查询返回明文

 

将其改为false,则查询为密文

 

标签:jdbc,SpringBoot,加解密,查询,Sphere,user,密文,true,name
From: https://www.cnblogs.com/badaoliumangqizhi/p/17556575.html

相关文章

  • mysql ST_DISTANCE_SPHERE
    教程:如何使用mysqlST_DISTANCE_SPHERE函数介绍在这篇教程中,我将教会你如何使用mysql的ST_DISTANCE_SPHERE函数。ST_DISTANCE_SPHERE函数可以计算两个地球上坐标点之间的距离。这对于需要计算地理位置相关信息的应用程序非常有用。本教程将介绍该函数的使用流程和具体步骤。使用......
  • SpringBoot中集成jasypt-spring-boot实现配置文件数据加密脱敏
    场景经常会遇到这样一种情况:项目的配置文件中总有一些敏感信息,比如数据源的url、用户名、密码....这些信息一旦被暴露那么整个数据库都将会被泄漏,那么如何将这些配置隐藏呢。除了使用手动将加密之后的配置写入到配置文件中,提取的时候再手动解密的方式,还可以使用如下方式。jas......
  • SpringBoot+Vue3+MySQL集群 开发健康体检双系统
    第1章课程介绍试看4节|38分钟观看项目演示,熟悉大健康体检项目主要功能。掌握学习本课程的最佳方法,以及如何利用在线手册学习和答疑。第2章大健康体检项目全栈环境搭建16节|218分钟利用虚拟机或者云主机安装Linux系统和Docker环境,部署MongoDB、Redis、Minio和RabbitMQ等中......
  • HJ29 字符串加解密
    1.题目读题HJ29 字符串加解密  考查点 2.解法思路 代码逻辑 具体实现 这道题目的解答思路是:首先,定义两个字符串,分别存储加密和解密的规则,例如"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"和"BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijk......
  • 从零玩转系列之SpringBoot3-核心原理
    一、简介1.前置知识●Java17●Spring、SpringMVC、MyBatis●Maven、IDEA2.环境要求环境&工具版本(orlater)SpringBoot3.1.xIDEA2023.xJava17+Maven3.5+Tomcat10.0+Servlet5.0+GraalVMCommunity22.3+NativeBuildTools0.9.19+......
  • 在Docker上实战ElasticSearch以及与SpringBoot集成
    简介项目地址:https://gitee.com/charlinchenlin/wysmallElasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elastic......
  • SpringBoot整合mybatis(plus)单表查询和多表查询
    SpringBoot整合mybatis(plus)单表查询和多表查询前言mybatis是springboot常用的操作数据库的框架,能够大大简化数据库操作,其可以进行xml配置开发,也可以进行注解开发。虽然现在有mybatis-plus,功能很强大,但也只是简化了单表操作,多表操作甚是麻烦。小型项目怎么用都可以,但是对于大型项......
  • SpringBoot配置文件加密
    大多数的项目都是需要用到配置文件的,配置文件配置了一些必备信息,就比如数据库链接信息,缓存信息,而这些信息以明文的形式写在配置文件中,这是相当危险的,下面我就介绍一种解决方案,通过把配置信息加密放在配置文件中,这样就大大降低了风险。话不多说,直接上案例,代码比什么都管用。1.导入依......
  • springboot 使用caffeine 并监控本地缓存
    1、添加依赖<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId></dependency> 2、添加配置packagecom.example.demo.config;importcom.github.ben......
  • SpringBoot 服务接口限流,搞定!
    来源:blog.csdn.net/qq_34217386/article/details/122100904  在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。限流可以认为服务降级的一种,限流通过限制请求的流量以达到保护系统的目的。  一般来说,系统的吞吐量是可以计算出一个阈值的,为了保证系统的稳定运......