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列)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM