摘要:
数据脱敏(Data Masking),又称数据漂白、数据去隐私化或数据变形。百度百科给出的解释:数据脱敏指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。数据安全技术之一,数据库安全技术主要包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。数据库安全风险包括:拖库、刷库、撞库。
开发系统过程中,对一些涉及用户的个人敏感信息,如密码、身份证号、家庭住址等信息,在进行存储数据库之前进行加密。使得即使存入数据库之后,数据库的管理员看到的数据也是加密的,可以在很大程度上提高数据的安全性。ShardingJdbc提供了内置的加密方式,MD5、AES,同时也支持自定义加密方式。
数据脱敏从技术上可以分为静态数据脱敏和动态数据脱敏两种:
- 静态数据脱敏一般应用于数据外发场景,例如需要将生产数据导出发送给开发人员、测试人员、分析人员等;
- 动态数据脱敏一般应用于直接连接生产数据的场景,例如运维人员在运维的工作中直接连接生产数据库进行运维,客服人员通过应用直接调取生产中的个人信息等。
数据脱敏的实现方式
- 使用脚本进行脱敏
- 使用专业的数据脱敏产品进行脱敏
脱敏实现
一、环境准备
程序环境:SpringBoot+MyBatis-plus
数据库环境:
数据库 | 数据库名称 | 数据表 |
---|---|---|
5.7.31-log | shardingsphere | user |
表结构:
二、添加相关依赖
<!--shardingsphere数据分片、脱敏工具-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
三、配置脱敏规则
#### spring ####
spring:
# 配置说明地址 http://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-proxy/configuration/
shardingsphere:
# 数据库
datasource:
# # 数据库的别名
names: ds0
# # 主库1
ds0:
### 数据源类别
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/shardingsphere?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
username: root
password: 123456
### 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 20
### 配置获取连接等待超时的时间,单位是毫秒
maxWait: 60000
### 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
### 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
### 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
### 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
### 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
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
user:
columns:
# 逻辑列,就是写SQL里面的列,因为实体类的名字和数据库的加密列一致,所以这里都是name
password:
# 原文列
plainColumn: password
# 密文列,用来存储密文数据
cipherColumn: md5_password
# 加密器名字
encryptor: encryptor_MD5
password1:
# 原文列
plainColumn: password1
# 密文列,用来存储密文数据
cipherColumn: aes_password
# 加密器名字
encryptor: encryptor_aes
# 数据脱敏规则配置---end
props:
# 打印SQL
sql.show: true
check:
table:
metadata: true
# 是否在启动时检查分表元数据一致性
enabled: true
query:
with:
cipher:
column: true
数据脱敏规说明:
- 配置了两种规则的加密器,分别是encryptor_MD5(使用md5加密),encryptor_aes(使用aes加密)。
- 需要脱敏的内容为user表中的password(逻辑列为password,使用md5加密,存储原文到password列,存储密文到md5_password列)、password1(逻辑列为password1,使用aes加密,存储原文到password1列,存储密文到aes_password列)。
四、实现脱敏
4.1 插入数据
存储接口调用数据:
数据持久化过程:
数据库存储的内容:
总结:
数据插入过程已经将password和password1分别按照md5和aes方法加密并存入对应得加密字段位置(实际过程中可以去掉原文列,只存储加密后的内容)
4.2 获取数据
数据获取过程:
接口获取到的数据:
总结:
数据获取过程将md5_password映射到password,将 aes_password 映射到 password1。从获取到的数据可以看出,已经将aes_password 内容解密到password1;但是由于md5是不可逆的过程,所以直接将md5_password映射到password中。
ShardingSphere-ShardingJdbc 数据脱敏官方文档:
https://shardingsphere.apache.org/document/legacy/4.x/document/cn/features/orchestration/encrypt/
源码传送门:https://github.com/oycyqr/springboot-learning-demo/tree/master/springboot-shardingsphere