当前位置:   article > 正文

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

shardingsphere 加密

场景

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

Sharding Sphere

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

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

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

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

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

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

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

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

数据脱敏 :: ShardingSphere

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

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

  1.         <dependency>
  2.             <groupId>org.apache.shardingsphere</groupId>
  3.             <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  4.             <version>4.1.1</version>
  5.         </dependency>

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

修改前的数据源配置

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

修改后的数据源配置

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

添加加密相关规则配置

  1. # 数据源
  2. spring:
  3.   application:
  4.     name: apiDataDesensitizationDemo
  5.   shardingsphere:
  6.     datasource:
  7.       names: ds0
  8.       ds0:
  9.         type: com.zaxxer.hikari.HikariDataSource
  10.         driver-class-name: com.mysql.jdbc.Driver
  11.        jdbc-url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
  12.         username: root
  13.         password: 123456
  14.     encrypt:
  15.       tables:
  16.         t_user:
  17.           columns:
  18.             name:
  19.               #plainColumn: pwd_plain
  20.               cipherColumn: name
  21.               encryptor: pwdEncrypt
  22.       encryptors:
  23.         pwdEncrypt:
  24.           type: AES
  25.           props:
  26.             aes:
  27.               key:
  28.                 value: 123456
  29.     props:
  30.       query:
  31.         with:
  32.           cipher:
  33.             column: true #是否使用密文列查询,false 则查询时返回密文,true则查询时返回明文

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

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

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

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

3、新建测试表t_user

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

只附实体类代码

  1. @Data
  2. public class User implements Serializable {
  3.     private static final long serialVersionUID = -5514139686858156155L;
  4.     private Integer id;
  5.     private Integer userId;
  6.     private String name;
  7.     private Integer age;
  8. }

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

  1. @RequestMapping("user")
  2. @RestController
  3. public class UserController {
  4.     @Autowired
  5.     private UserService userService;
  6.     @RequestMapping("save")
  7.     public String save() {
  8.         User user = new User();
  9.         user.setUserId(new Random().nextInt( 1000 ) + 1);
  10.         user.setName("张三"+user.getUserId());
  11.         user.setAge(new Random().nextInt( 80 ) + 1);
  12.         userService.insert(user);
  13.         return "save success";
  14.     }
  15.     @RequestMapping("findAll")
  16.     public String findAll() {
  17.         List<User> all = userService.findAll();
  18.         return all.toString();
  19.     }
  20. }

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

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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/210905
推荐阅读
相关标签
  

闽ICP备14008679号