解决方案详解

在了解了ShardingSphere脱敏处理流程后,即可将脱敏配置、脱敏处理流程与实际场景进行结合。所有的设计开发都是为了解决业务场景遇到的痛点。那么面对之前提到的业务场景需求,又应该如何使用ShardingSphere这把利器来满足业务需求呢?

1、新上线业务

  • 业务场景分析:新上线业务由于一切从零开始,不存在历史数据清洗问题,所以相对简单。
  • 解决方案说明:选择合适的加密器,如AES后,只需配置逻辑列(面向用户编写SQL)和密文列(数据表存密文数据)即可,逻辑列和密文列可以相同也可以不同。建议配置如下(Yaml格式展示):

encryptRule:
encryptors:
aes_encryptor:
type: aes
props:
aes.key.value: 123456abc
tables:
t_user:
columns:
pwd:
cipherColumn: pwd
encryptor: aes_encryptor

使用这套配置,Encrypt-JDBC只需将logicColumn和cipherColumn进行转换,底层数据表不存储明文,只存储了密文,这也是安全审计部分的要求所在。如果用户希望将明文、密文一同存储到数据库,只需添加plainColumn配置即可。整体处理流程如下图所示:

2、已上线业务改造

  • 业务场景分析:由于业务已经在线上运行,数据库里必然存有大量明文历史数据。现在的问题是如何让历史数据得以加密清洗、如何让增量数据得以加密处理、如何让业务在新旧两套数据系统之间进行无缝、透明化迁移。
  • 解决方案说明:在提供解决方案之前,我们先来头脑风暴一下:首先,既然是旧业务需要进行脱敏改造,那一定存储了非常重要且敏感的信息。这些信息含金量高且业务相对基础重要。如果搞错了,整个团队KPI就再见了。所以不可能一上来就停业务,禁止新数据写入,再找个加密器把历史数据全部加密清洗,再把之前重构的代码部署上线,使其能把存量和增量数据进行在线加密解密。如此简单粗暴的方式,按照历史经验来谈,一定凉凉。

那么另一种相对安全的做法是:重新搭建一套和生产环境一模一样的预发环境,然后通过相关迁移洗数工具把生产环境的存量原文数据加密后存储到预发环境,而新增数据则通过例如MySQL主从复制及业务方自行开发的工具加密后存储到预发环境的数据库里,再把重构后可以进行加解密的代码部署到预发环境。这样生产环境是一套以明文为核心的查询修改的环境;预发环境是一套以密文为核心加解密查询修改的环境。在对比一段时间无误后,可以夜间操作将生产流量切到预发环境中。此方案相对安全可靠,只是时间、人力、资金、成本较高,主要包括:预发环境搭建、生产代码整改、相关辅助工具开发等。除非无路可走,否则业务开发人员一般是从入门到放弃。

业务开发人员最希望的做法是:减少资金费用的承担、最好不要修改业务代码、能够安全平滑迁移系统。于是,ShardingSphere的脱敏功能模块便应用而生。可分为三步进行:

3、系统迁移前

假设系统需要对t_user的pwd字段进行脱敏处理,业务方使用Encrypt-JDBC来代替标准化的JDBC接口,此举基本不需要额外改造(我们还提供了SpringBoot,SpringNameSpace,Yaml等接入方式,满足不同业务方需求)。另外,提供一套脱敏配置规则,如下所示:

encryptRule:
encryptors:
aes_encryptor:
type: aes
props:
aes.key.value: 123456abc
tables:
t_user:
columns:
pwd:
plainColumn: pwd
cipherColumn: pwd_cipher
encryptor: aes_encryptor
props:
query.with.cipher.column: false

依据上述脱敏规则可知,首先需要在数据库表t_user里新增一个字段叫做pwd_cipher,即cipherColumn,用于存放密文数据,同时我们把plainColumn设置为pwd,用于存放明文数据,而把logicColumn也设置为pwd。由于之前的代码SQL就是使用pwd进行编写,即面向逻辑列进行SQL编写,所以业务代码无需改动。通过Encrypt-JDBC,针对新增的数据,会把明文写到pwd列,并同时把明文进行加密存储到pwd_cipher列。此时,由于query.with.cipher.column设置为false,对业务应用来说,依旧使用pwd这一明文列进行查询存储,却在底层数据库表pwd_cipher上额外存储了新增数据的密文数据,其处理流程如下图所示:

新增数据在插入时,就通过Encrypt-JDBC加密为密文数据,并被存储到了cipherColumn。而现在就需要处理历史明文存量数据。由于Apache ShardingSphere目前并未提供相关迁移洗数工具,此时需要业务方自行将pwd中的明文数据进行加密处理存储到pwd_cipher。

4、系统迁移中

新增的数据已被Encrypt-JDBC将密文存储到密文列,明文存储到明文列;历史数据被业务方自行加密清洗后,将密文也存储到密文列。也就是说现在的数据库里即存放着明文也存放着密文,只是由于配置项中的

query.with.cipher.column=false,所以密文一直没有被使用过。现在我们为了让系统能切到密文数据进行查询,需要将脱敏配置中的query.with.cipher.column设置为true。在重启系统后,我们发现系统业务一切正常,但是Encrypt-JDBC已经开始从数据库里取出密文列的数据,解密后返回给用户;而对于用户的增删改需求,则依旧会把原文数据存储到明文列,加密后密文数据存储到密文列。

虽然现在业务系统通过将密文列的数据取出,解密后返回;但是,在存储的时候仍旧会存一份原文数据到明文列,这是为什么呢?答案是:为了能够进行系统回滚。因为只要密文和明文永远同时存在,我们就可以通过开关项配置自由将业务查询切换到cipherColumn或plainColumn。也就是说,如果将系统切到密文列进行查询时,发现系统报错,需要回滚。那么只需将query.with.cipher.column=false,Encrypt-JDBC将会还原,即又重新开始使用plainColumn进行查询。处理流程如下图所示:

5、系统迁移后

由于安全审计部门要求,业务系统一般不可能让数据库的明文列和密文列永久同步保留,我们需要在系统稳定后将明文列数据删除。即我们需要在系统迁移后将plainColumn,即pwd进行删除。那问题来了,现在业务代码都是面向pwd进行编写SQL的,把底层数据表中的存放明文的pwd删除了,换用pwd_cipher进行解密得到原文数据,那岂不是意味着业务方需要整改所有SQL,从而不使用即将要被删除的pwd列?还记得我们Encrypt-JDBC的核心意义所在吗?

这也正是Encrypt-JDBC核心意义所在,即依据用户提供的脱敏规则,将用户SQL与底层数据库表结构割裂开来,使得用户的SQL编写不再依赖于真实的数据库表结构。而用户与底层数据库之间的衔接、映射、转换交由ShardingSphere进行处理。

是的,因为有logicColumn存在,用户的编写SQL都面向这个虚拟列,Encrypt-JDBC就可以把这个逻辑列和底层数据表中的密文列进行映射转换。于是迁移后的脱敏配置即为:

encryptRule:
encryptors:
aes_encryptor:
type: aes
props:
aes.key.value: 123456abc
tables:
t_user:
columns:
pwd: # pwd与pwd_cipher的转换映射
cipherColumn: pwd_cipher
encryptor: aes_encryptor
props:
query.with.cipher.column: true

其处理流程如下

至此,已在线业务脱敏整改解决方案全部叙述完毕。我们提供了Java、Yaml、SpringBoot、SpringNameSpace多种方式供用户选择接入,力求满足业务不同的接入需求。该解决方案目前已在京东数科不断落地上线,提供对内基础服务支撑。

中间件脱敏服务优势

  1. 自动化&透明化数据脱敏过程,用户无需关注脱敏中间实现细节。
  2. 提供多种内置、第三方(AKS)的脱敏策略,用户仅需简单配置即可使用。
  3. 提供脱敏策略API接口,用户可实现接口,从而使用自定义脱敏策略进行数据脱敏。
  4. 支持切换不同的脱敏策略。
  5. 针对已上线业务,可实现明文数据与密文数据同步存储,并通过配置决定使用明文列还是密文列进行查询。可实现在不改变业务查询SQL前提下,已上线系统对加密前后数据进行安全、透明化迁移。

适用场景说明

  1. 用户项目使用Java语言进行编程。
  2. 后端数据库为MySQL、Oracle、PostgreSQL、SQLServer。
  3. 用户需要对数据库表中某个或多个列进行脱敏(数据加密&解密)。
  4. 兼容所有常用SQL。

限制条件

  1. 用户需要自行处理数据库中原始的存量数据、洗数。
  2. 使用脱敏功能+分库分表功能,部分特殊SQL不支持,请参考SQL使用规范。
  3. 脱敏字段无法支持比较操作,如:大于小于、ORDER BY、BETWEEN、LIKE等。
  4. 脱敏字段无法支持计算操作,如:AVG、SUM以及计算表达式。

后 续

本篇文章介绍了如何使用ShardingSphere产品之一的Encrypt-JDBC进行接入,接入形式还可以选择使用SpringBoot、SpringNameSpace等,这种形态的接入端主要面向JAVA同构,并与业务代码共同部署在生产环境中。面向异构语言,ShardingSphere还提供Encrypt-Proxy客户端。Encrypt-Proxy是一款实现MySQL、PostgreSQL的二进制协议的服务器端产品,用户可独立部署Encrypt-Proxy服务,并且像使用普通MySQL、PostgreSQL数据库一样,使用例如Navicat第三方数据库管理工具、JAVA连接池、命令行的方式访问这台具有脱敏功能的虚拟数据库服务器。

脱敏功能属于Apache ShardingSphere分布式治理的功能范畴。事实上,Apache ShardingSphere这个生态还拥有其他更强大的能力,例如数据分片、读写分离、分布式事务、监控治理等。您甚至可以选择任意多种功能模块进行叠加使用,例如同时使用数据脱敏+数据分片,或是数据分片+读写分离,再或者是监控治理+数据分片等。除了在功能层面的叠加选择,ShardingSphere还提供了各种接入端形式,例如Sharding-JDBC或Sharding-Proxy等以满足大家不同场景需求。

写在最后

ShardingSphere从最初的仅支持分库分表功能,到现在已形成包括数据分片、分布式治理、分布式事务等核心功能为主的生态圈。这也标识着它不仅仅是一款分布式数据库中间件,不仅仅拥有分库分表的能力,更是形成以数据分片、分布式治理、分布式事务为核心的全方位解决方案生态体系

数据脱敏和加密_Apache ShardingSphere数据脱敏全解决方案详解相关推荐

  1. pandas dataframe数据聚合groupby、agg、privot基于sum统计详解及实例

    pandas dataframe数据聚合groupby.agg.privot基于sum统计详解及实例 知道了sum.那么min.max.mean.median都是举一反三的事情了. 在日常的数据分析中 ...

  2. python可以处理多大的数据_科多大数据之Python基础教程之Excel处理库openpyxl详解...

    原标题:科多大数据之Python基础教程之Excel处理库openpyxl详解 科多大数据小课堂来啦~Python基础教程之Excel处理库openpyxl详解 openpyxl是一个第三方库,可以处 ...

  3. 云计算、大数据、人工智能傻傻分不清楚?本文详解这三者的关系

    云计算.大数据.人工智能傻傻分不清楚?本文详解这三者的关系 提示: 今天跟大家讲讲云计算.大数据和人工智能.这三个词现在非常火,并且它们之间好像互相有关系. 一般谈云计算的时候会提到大数据.谈人工智能 ...

  4. 【数据的存储】浮点数在内存中的存储详解【超详细的保姆级别教程,让面试官心服口服】手撕浮点数存储使用方式

    [数据的存储]浮点数在内存中的存储详解[超详细的保姆级别教程,让面试官对你心服口服]手撕浮点数存储使用方式 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客 ...

  5. 大数据单机学习环境搭建(5)Hive建表DDL详解

    专题:大数据单机学习环境搭建和使用 1. Hive建表简单示例 1.1.Hive建表语句 1.2.表详细信息 1.3.数据展示 2. Hive建表语法详解 3.拓展1:复杂数据分割 4.拓展2:事务表 ...

  6. 数据训练营|BAT都在用的方法,详解A/B测试的那些坑!

    作者|蚂蚁金服人工智能部产品经理 范磊 本文首发|微信公众号 友盟数据服务 (ID:umengcom),转载请注明出处 If you are not running experiments,you a ...

  7. 守护客户数据价值:企业级NewSQL HTAP分布式云TBase架构详解

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:jasonys,隶属于腾讯技术工程事业群数据平台部,负责TBase数据的技术研发和架构设计,有超过10年的数据库内核开发设计经验,完成 ...

  8. 视图插入数据_数据库DQL、DML、DDL、DCL 详解

    SQL(Structure Query Language)语言是数据库的核心语言. SQL是一个标准的数据库语言,是面向集合的描述性非过程化语言. SQL语言共分为四大类:数据查询语言DQL,数据操纵 ...

  9. java解析日志数据_Java实时监控日志文件并输出的方法详解

    Java实时监控日志文件并输出的方法详解 想在前台显示数据同步过程中产生的日志文件,在网上找到解决方案,做了代码测试好用.这里做个记录 java.io.RandomAccessFile可以解决同时向文 ...

最新文章

  1. 如何衡量目标检测模型的优劣
  2. 教你快速写出多线程Junit单元测试用例 - GroboUtils
  3. DataGridView滚动慢的解决方法
  4. 【Obj-C】学习杂记-1
  5. java编码-多重(乱码)
  6. Android Studio 项目断开SVN连接
  7. Linux实验室阿里云证书,开发者云体验实验室
  8. Of Study - Francis Bacon
  9. STM32----摸石头过河系列(八)
  10. .NET中Web Service的异常机制
  11. PMP考试教材是什么?有几本?
  12. Python:利用python代码编程实现将视频的avi格式转换为MP4格式
  13. 天线发射功率计算公式_天线增益的定义/计算公式/发射功率
  14. (转载)JDO快速入门(原理详解)
  15. 水电水利建设项目水环境与水生生态保护技术政策
  16. 哈工大SCIR出品《自然语言处理》新书,无套路送5本!
  17. 小白鼠与毒药解题过程分析
  18. HTTP 状态消息 200 302 304 403 404 500 分别表示什么?
  19. uniapp苹果端IOS日期类型显示NAN
  20. 数据结构-线性表的顺序、链式存储结构

热门文章

  1. LeetCode刷题(Python)——汉明距离
  2. Linux(debian7)操作基础(十二)之文件加密使用指南
  3. matpltlib.pyplot绘制饼图
  4. 【AI视野·今日CV 计算机视觉论文速览 第180期】Wed, 26 Feb 2020
  5. 【会议/期刊】中科院推荐计算机领域人工智能方向会议和期刊列表
  6. 媒体播放控件导入到窗体中 winform 0131
  7. 对象交互 空调与摇控器 0107
  8. 工具栏的使用 1118
  9. 爬虫-访问用户中心页面-服务端做了些什么
  10. 数据结构与算法-索引1909