ShardingJdbc 数据脱敏

1、定义

     数据脱敏(Data Masking),又称数据漂白、数据去隐私化或数据变形。

     百度百科给出的解释:数据脱敏指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。数据安全技术之一,数据库安全技术主要包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。数据库安全风险包括:拖库、刷库、撞库。
开发系统过程中,对一些涉及用户的个人敏感信息,如密码、身份证号、家庭住址等信息,在进行存储数据库之前进行加密。使得即使存入数据库之后,数据库的管理员看到的数据也是加密的,可以在很大程度上提高数据的安全性。ShardingJdbc提供了内置的加密方式,MD5、AES,同时也支持自定义加密方式。

    数据脱敏从技术上可以分为静态数据脱敏和动态数据脱敏两种:

  1. 静态数据脱敏一般应用于数据外发场景,例如需要将生产数据导出发送给开发人员、测试人员、分析人员等;
  2. 动态数据脱敏一般应用于直接连接生产数据的场景,例如运维人员在运维的工作中直接连接生产数据库进行运维,客服人员通过应用直接调取生产中的个人信息等。

    数据脱敏的实现方式

  1. 使用脚本进行脱敏
  2. 使用专业的数据脱敏产品进行脱敏

2、使用

程序环境:SpringBoot+MyBatis-plus

pom.xml添加相关依赖

<!--shardingsphere数据分片、脱敏工具-->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.0</version>
</dependency>

配置脱敏规则

spring:
 # 配置说明地址 https://test1.apache.org/document/legacy/4.x/document/cn/manual/sharding-jdbc/configuration/config-spring-boot/#%E6%95%B0%E6%8D%AE%E5%88%86%E7%89%87
  shardingsphere:
   # 数据库
    datasource:
     # 主库1 ,master数据库
      master0:
        ###  数据源类别
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.8.162:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
        username: root
        password: root
       # 主库1从库1 ,slave数据库
      master0slave0:
        ###  数据源类别
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.8.134:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
        username: root
        password: root
       # 主库1从库2 ,slave数据库
      master0slave1:
        ###  数据源类别
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.8.176:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
        username: root
        password: root
         # 主库2 ,master数据库
      master1:
        ###  数据源类别
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.8.162:3306/test2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
        username: root
        password: root
       # 主库2从库1 ,slave数据库
      master1slave0:
        ###  数据源类别
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.8.134:3306/test2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
        username: root
        password: root
       # 主库2从库2 ,slave数据库
      master1slave1:
        ###  数据源类别
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.8.176:3306/test2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
        username: root
        password: root
        # 数据库的别名
      names: master0,master0slave0,master0slave1,master1,master1slave0,master1slave1
    sharding:
    # 数据脱敏规则配置---start
      encrypt-rule:
        encryptors:
          encryptor_MD5:
            type: MD5
            props:
              md5.key.value: 123456
          encryptor_aes:
            # 加密、解密器的名字,内置的为MD5,aes.
            # 可以自定义,实现
            # org.apache.shardingsphere.encrypt.strategy.spi.Encryptor
            # 或者
            # org.apache.shardingsphere.encrypt.strategy.spi.QueryAssistedEncryptor
            # 这两个接口即可
            type: aes
            props:
              aes.key.value: 123456
        tables:
        # tables
          t_user:
            columns: 
              # 逻辑列,就是写SQL里面的列,因为实体类的名字和数据库的加密列一致,所以这里都是name
               password:
                # 原文列
                plainColumn: password
                # 密文列,用来存储密文数据
                cipherColumn: md5_password
                # 加密器名字
                encryptor: encryptor_MD5
               password1:
                # 原文列
                plainColumn: password1
                # 密文列,用来存储密文数据
                cipherColumn: aes_password
                # 加密器名字
                encryptor: encryptor_aes
      # 数据脱敏规则配置---end   
      # 设置绑定表,用逗号分割
      binding-tables: t_user
      master-slave-rules:
        ds0:
          name: ds0datasource
      # 查询时的负载均衡算法,目前有2种算法,round_robin(轮询)和random(随机),
      # 算法接口是io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithm。
      # 实现类有RandomMasterSlaveLoadBalanceAlgorithm 和 RoundRobinMasterSlaveLoadBalanceAlgorithm。
          load-balance-algorithm-type: round_robin
       # 主数据源名称
          master-data-source-name: master0
          # 从数据源名称,多个用逗号隔开
          slave-data-source-names: master0slave0, master0slave1
        ds1:
          name: ds1datasource
      # 查询时的负载均衡算法,目前有2种算法,round_robin(轮询)和random(随机),
      # 算法接口是io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithm。
      # 实现类有RandomMasterSlaveLoadBalanceAlgorithm 和 RoundRobinMasterSlaveLoadBalanceAlgorithm。
          load-balance-algorithm-type: round_robin
       # 主数据源名称
          master-data-source-name: master1
          # 从数据源名称,多个用逗号隔开
          slave-data-source-names: master1slave0,master1slave1
      tables:
        ### t_user分库分表配置
        t_user:
          actual-data-nodes: ds$->{0..1}.t_user_$->{0..3}
          database-strategy:
            standard:
              precise-algorithm-class-name: com.demo.shardingjdbc.MyDBPreciseShardingAlgorithm
              sharding-column: id
          table-strategy:
            standard:
              precise-algorithm-class-name: com.demo.shardingjdbc.MyTablePreciseShardingAlgorithm
              sharding-column: id
#### mybatis-plus ###
mybatis-plus:
  # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
  # 如果是放在resource目录 classpath:/mapper/*Mapper.xml
  mapper-locations: classpath:mapper/*.xml
  #实体扫描,多个package用逗号或者分号分隔
  type-aliases-package: com.demo.shardingjdbc.entity
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
  #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
  global-config:
    db-config:
      id-type: auto
      #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
      field-strategy: not-empty
      #驼峰下划线转换
      column-underline: true
      #逻辑删除配置
      logic-delete-value: 0
      logic-not-delete-value: 1
      db-type: mysql
  #刷新mapper 调试神器
  refresh: false

数据脱敏规说明:

  • 配置了两种规则的加密器,分别是encryptor_MD5(使用md5加密),encryptor_aes(使用aes加密)。
  • 需要脱敏的内容为user表中的password(逻辑列为password,使用md5加密,存储原文到password列,存储密文到md5_password列)、password1(逻辑列为password1,使用aes加密,存储原文到password1列,存储密文到aes_password列)。

 

posted @ 2021-01-19 15:18  hzy_叶子  阅读(718)  评论(0编辑  收藏  举报