数据脱敏剖析
# 数据脱敏剖析
ShardingSphere > Concepts & Features > Orchestration > Data Masking (opens new window)
数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。涉及客户安全数据或者一些商业性敏感数据,如身份证号、手机号、卡号、客户号等个人信息按照规定,都需要进行数据脱敏。
数据脱敏模块属于ShardingSphere分布式治理这一核心功能下的子功能模块,提供了一套完整、安全、透明化、低改造成本的数据加密整合解决方案。
- 在更新操作时,它通过对用户输入的SQL进行解析,并依据用户提供的脱敏配置对SQL进行改写,从而实现对原文数据进行加密,并将密文数据存储到底层数据库。
- 在查询数据时,它又从数据库中取出密文数据,并对其解密,最终将解密后的原始数据返回给用 户。
# 整体架构
ShardingSphere提供的Encrypt-JDBC和业务代码部署在一起,业务方需面向Encrypt-JDBC进行JDBC编程。
Encrypt-JDBC将用户发起的SQL进行拦截,并通过SQL语法解析器进行解析、理解SQL行为,再依据用户传入的脱敏规则,找出需要脱敏的字段和所使用的加解密器对目标字段进行加解密处理后,再与底层数据库进行交互。
# 脱敏规则
脱敏配置主要分为四部分:数据源配置,加密器配置,脱敏表配置以及查询属性配置:、
- 数据源配置:指DataSource的配置信息
- 加密器配置:指使用什么加密策略进行加解密。目前ShardingSphere内置了这些加解密策略 (opens new window):MD5、AES、RC4、SM3、SM4
- 脱敏表配置:指定哪个列用于存储密文数据(cipherColumn)、哪个列用于存储明文数据(plainColumn)以及用户想使用哪个列进行SQL编写(logicColumn)用于计算加解密列的逻辑名称。
- 逻辑列(logicColumn):用于计算加解密列的逻辑名称,是 SQL 中列的逻辑标识。包含下面三者。(POJO定义该列,配置中使用)
- 密文列(cipherColumn):加密后的数据列。
- 明文列:存储明文的列,用于在加密数据迁移过程中仍旧提供服务。 在洗数结束后可以删除。
- 查询辅助列:用于查询的辅助列。 对于一些安全级别更高的非幂等加密算法,提供不可逆的幂等列用于查询。
- 查询属性的配置:当底层数据库表里同时存储了明文数据、密文数据后,该属性开关用于决定是直接查询数据库表里的明文数据进行返回,还是查询密文数据通过Encrypt-JDBC解密后返回。
配置项参考:
rules:
- !ENCRYPT
tables:
<table-name> (+): # 加密表名称
columns:
<column-name> (+): # 加密列名称
cipherColumn: # 密文列名称
assistedQueryColumn (?): # 查询辅助列名称
plainColumn (?): # 原文列名称
encryptorName: # 加密算法名称
queryWithCipherColumn(?): # 该表是否使用加密列进行查询
# 加密算法配置
encryptors:
<encrypt-algorithm-name> (+): # 加解密算法名称
type: # 加解密算法类型
props: # 加解密算法属性配置
# ...
queryWithCipherColumn: # 是否使用加密列进行查询。在有原文列的情况下,可以使用原文列进行查询
# 脱敏处理流程
下图可以看出ShardingSphere将逻辑列与明文列和密文列进行了列名映射:
下图展示了使用Encrypt-JDBC进行增删改查时,其中的处理流程和转换逻辑:
# 加密策略解析
以ShardingSphere提供的MD5、AES加密策略为例,该两种策略分别对应ShardingSphere的两种加解密Encryptor和QueryAssistedEncryptor。
Encryptor:该解决方案通过提供encrypt(), decrypt()两种方法对需要脱敏的数据进行加解密。在用户进行INSERT, DELETE, UPDATE时,ShardingSphere会按照用户配置,对SQL进行解析、改写、路由,并会调用encrypt()将数据加密后存储到数据库, 而在SELECT时,则调用decrypt()方法将从数据库中取出的脱敏数据进行逆向解密,最终将原始数据返回给用户。
当前,ShardingSphere针对这种类型的脱敏解决方案提供了两种具体实现类,分别是MD5(不可逆),AES(可逆),用户只需配置即可使用这两种内置的方案。
QueryAssistedEncryptor:相比较于第一种脱敏方案,该方案更为安全和复杂。它的理念是:即使是相同的数据,如两个用户的密码相同,它们在数据库里存储的脱敏数据也应当是不一样的。这种理念更有利于保护用户信息,防止撞库成功。
它提供三种函数进行实现,分别是encrypt(), decrypt(), queryAssistedEncrypt()。在encrypt()阶段,用户通过设置某个变动种子,例如时间戳。针对原始数据+变动种子组合的内容进行加密,就能保证即使原始数据相同,也因为有变动种子的存在,致使加密后的脱敏数据是不一样的。在decrypt()可依据之前规定的加密算法,利用种子数据进行解密。queryAssistedEncrypt()用于生成辅助查询列,用于原始数据的查询过程。
当前,ShardingSphere针对这种类型的脱敏解决方案并没有提供具体实现类,却将该理念抽象成接口,提供给用户自行实现。ShardingSphere将调用用户提供的该方案的具体实现类进行数据脱敏。