Apache ShardingSphere 数据脱敏

本贴最后更新于 1672 天前,其中的信息可能已经时移世易

写在前面

由于现在 SpringBoot 很火,因此本文主要使用 SpringBoot 2.x 进行相关介绍。
Apache ShardingSphere Github:
https://github.com/apache/incubator-shardingsphere
ShardingSphere 说明文档:https://shardingsphere.apache.org/document/current/cn/overview/

需求场景分析

对于数据脱敏的需求,在现实的业务场景中一般分为两种情况:

  1. 新业务上线,安全部门规定需将涉及用户敏感信息,例如银行、手机号码等进行加密后存储到数据库,在使用的时候再进行解密处理。因为是全新系统,因而没有存量数据清洗问题,所以实现相对简单。
  2. 已上线业务,之前一直将明文存储在数据库中。相关部门突然需要对已上线业务进行脱敏整改。这种场景一般需要处理三个问题:
    a) 历史数据需要如何进行脱敏处理,即洗数。
    b) 如何能在不改动业务 SQL 和逻辑情况下,将新增数据进行脱敏处理,并存储到数据库;在使用时,再进行解密取出。
    c) 如何较为安全、无缝、透明化地实现业务系统在明文与密文数据间的迁移。

处理流程详解

1.png
2.png
3.png
4.png

实战体验

添加依赖

 <!--引入shardingsphere-->
<dependency>
       <groupId>org.apache.shardingsphere</groupId>
      <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
      <version>4.0.0-RC2</version>
</dependency>
<dependency>
     <groupId>org.apache.shardingsphere</groupId>
     <artifactId>sharding-jdbc-spring-namespace</artifactId>
     <version>4.0.0-RC2</version>
</dependency>

注意:官方最新文档只适用最新版本,其他版本可能因为兼容性问题无法正常使用。

创建数据表

CREATE TABLE `t_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pwd_cipher` varchar(2000) DEFAULT NULL COMMENT '密文数据列',
  `pwd_plain` varchar(255) DEFAULT NULL COMMENT '明文数据列',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

添加 ShardingSphere 配置信息

注:此处使用 yml 格式文件,且之前配置的 springboot 原生的数据源信息要移除,此处可以选择自己喜欢的数据库连接池。

spring:
  shardingsphere:
    datasource: #使用shardingsphere的数据源代替原生数据源
      name: ds
      ds:          #基础数据库信息配置,参数同原生一致
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/encrypt?serverTimezone=UTC&useSSL=false
        username: root
        password: root
        max-total: 100
        initialSize:  10
        minIdle:  10
        maxActive:  100
        maxWait:  60000
        timeBetweenEvictionRunsMillis:  60000
        minEvictableIdleTimeMillis:  300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle:  true
        testOnBorrow:  false
        testOnReturn:  false
        poolPreparedStatements:  true
        maxPoolPreparedStatementPerConnectionSize:  20
    encrypt:
      encryptors:  #定义加密算法
        encryptor_aes: #加密算法1 AES,名字可以自定义
          type: aes
          props:
            aes.key.value: 123456
      tables:        #定义脱敏规则
        t_order:    #目标表
          columns: 
            pwd:    #目标表逻辑列
              plainColumn: pwd_plain  #目标表明文列
              cipherColumn: pwd_cipher  #目标表密文列
              encryptor: encryptor_aes     #采用的加密算法
    props: 
      sql.show: true                              #打印SQL
      query.with.cipher.comlum: true     #使用密文搜索 

注入数据源

   import javax.sql.DataSource;
    @Resource
    private DataSource dataSource;

适用场景说明

  1. 后端数据库为 MySQL、Oracle、PostgreSQL、SQLServer。
  2. 用户需要对数据库表中某个或多个列进行脱敏(数据加密&解密)。
  3. 兼容所有常用 SQL

限制条件

  1. 用户需要自行处理数据库中原始的存量数据、洗数。
  2. 使用脱敏功能 + 分库分表功能,部分特殊 SQL 不支持,请参考 SQL 使用规范
  3. 脱敏字段无法支持比较操作,如:大于小于、ORDER BY、BETWEEN、LIKE 等
  4. 脱敏字段无法支持计算操作,如:AVG、SUM 以及计算表达式

更多介绍

参考官方说明文档:
https://shardingsphere.apache.org/document/current/cn/features/orchestration/encrypt/

  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖 • 2 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    938 引用 • 1456 回帖 • 163 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...