ShardingJDBC 12_数据脱敏

224 阅读3分钟

1 什么是数据脱敏

数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。涉及客户安全数据或者一些商业性敏感数据,如身份证号、手机号、卡号、客户号等个人信息,按照规定,都需要进行数据脱敏。

数据脱敏模块属于 ShardingSphere 分布式治理这一核心功能下的子功能模块功能。

  • 在更新操作时,通过对用户输入的SQL进行解析,并依据用户提供的脱敏配置对SQL进行改写,从而实现对原文数据进行加密,并将密文数据存储到底层数据库。
  • 在查询数据时,从数据库中取出密文数据并对其解密,最终将解密后的原始数据返回给用户。

2 脱敏的构架

image.png

Encrypt-JDBC 将用户发起的SQL进行拦截,并通过SQL语法解析器进行解析、理解SQL行为,再依据用户传入的脱敏规则,找出需要脱敏的字段和所使用的加密解密器对目标字段进行加密或解密处理后,再与底层数据库进行交互。

3 脱敏规则

脱敏配置主要分为四部分:数据源配置,加密器配置,脱敏表配置以及查询属性配置,其详情如下图所示:

image.png

  • 数据源配置:配置数据源信息,如数据库的URL,账号信息等。
  • 加密算法配置:指使用什么加密算法进行加解密。目前 ShardingSphere 内置了三种加解密算法:AES,MD5 和 RC4。当这些都无法满足要求时,还可以通过实现 ShardingSphere 提供的接口,自行编写一套加解密算法。
  • 加密表配置:用于告诉 ShardingSphere 数据表里哪个列用于存储密文数据(cipherColumn)、哪个列用于存储明文数据(plainColumn)以及用户想使用哪个列进行SQL编写(logicColumn)。

4 脱敏处理流程

举个栗子,假如数据库里有一张表叫做 t_user,这张表里有两个字段

  • pwd_plain 用于存放明文数据;
  • pwd_cipher 用于存放密文数据;
  • 同时定义 logicColumn 为 pwd。

那么,用户在编写 SQL 时应该面向 logicColumn 进行编写,即

INSERT INTO t_user SET pwd = '123'

ShardingSphere 接收到该SQL后,通过用户提供的加密配置,发现 pwd 是 logicColumn,于是便对逻辑列及其对应的明文数据进行加密处理。 Apache ShardingSphere 将面向用户的逻辑列与面向底层数据库的明文列和密文列进行了列名以及数据的加密映射转换。  

如下图所示:

image.png

即依据用户提供的加密规则,将用户 SQL 与底层数据表结构割裂开来,使得用户的 SQL 编写不再依赖于真实的数据库表结构。 而用户与底层数据库之间的衔接、映射、转换交由 Apache ShardingSphere 进行处理。 

下方图片展示了使用加密模块进行增删改查时,其中的处理流程和转换逻辑:

image.png

当启用了加密查询时,即设置 query.with.cipher.column=true,得到的查询结果是密文列。

5 加密策略

ShardingSphere 提供了两种加密策略用于数据脱敏,分别对应 ShardingSphere 的两种加解密的接口,即:

  • Encryptor
  • QueryAssistedEncryptor

一方面,Apache ShardingSphere 为用户提供了内置的加解密实现类,用户只需进行配置即可使用;

另一方面,为了满足用户不同场景的需求,ShardingSphere 还开放了相关加解密接口,用户可依据这两种类型的接口提供具体实现类。

在进行简单配置后,即可让 Apache ShardingSphere 调用用户自定义的加解密方案进行数据加密。