1、定義
數據脫敏(Data Masking),又稱數據漂白、數據去隱私化或數據變形。
百度百科給出的解釋:數據脫敏指對某些敏感信息通過脫敏規則進行數據的變形,實現敏感隱私數據的可靠保護。在涉及客戶安全數據或者一些商業性敏感數據的情況下,在不違反系統規則條件下,對真實數據進行改造並提供測試使用,如身份證號、手機號、卡號、客戶號等個人信息都需要進行數據脫敏。數據安全技術之一,數據庫安全技術主要包括:數據庫漏掃、數據庫加密、數據庫防火牆、數據脫敏、數據庫安全審計系統。數據庫安全風險包括:拖庫、刷庫、撞庫。
開發系統過程中,對一些涉及用戶的個人敏感信息,如密碼、身份證號、家庭住址等信息,在進行存儲數據庫之前進行加密。使得即使存入數據庫之后,數據庫的管理員看到的數據也是加密的,可以在很大程度上提高數據的安全性。ShardingJdbc提供了內置的加密方式,MD5、AES,同時也支持自定義加密方式。
數據脫敏從技術上可以分為靜態數據脫敏和動態數據脫敏兩種:
- 靜態數據脫敏一般應用於數據外發場景,例如需要將生產數據導出發送給開發人員、測試人員、分析人員等;
- 動態數據脫敏一般應用於直接連接生產數據的場景,例如運維人員在運維的工作中直接連接生產數據庫進行運維,客服人員通過應用直接調取生產中的個人信息等。
數據脫敏的實現方式
- 使用腳本進行脫敏
- 使用專業的數據脫敏產品進行脫敏
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列)。