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