zoukankan      html  css  js  c++  java
  • 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列)。
  • 相关阅读:
    【java 自动化测试】TestNg 介绍
    【java 自动化测试】第14章:持续集成
    【java 自动化】15章节:课程总结
    【性能测试】看了一个博客,总结一下
    【Dubbo】Dubbo 接口是什么? 与http 接口有什么区别?
    【jmeter】性能测试报告分析
    Netty 相关目录
    Netty 源码学习——EventLoop
    Netty 源码分析——ChannelPipeline
    Netty 源码学习——服务端流程分析
  • 原文地址:https://www.cnblogs.com/h-z-y/p/14297570.html
Copyright © 2011-2022 走看看