敏感数据,“一键脱敏”,Sharding Sphere 完美搞定

敏感数据,“一键脱敏”,Sharding Sphere 完美搞定来源 https jaskey github io blog 2020 03 18 sharding sphere data desensitizat Jaskey Lam 在真实业务场景中 数据库中经常需要存储某些客户的关键性敏感信息如 身份证号 银行卡号 姓名 手机号码等 此类信息按照合规要求

大家好,我是讯享网,很高兴认识大家。

来源:https://jaskey.github.io/blog/2020/03/18/sharding-sphere-data-desensitization/Jaskey Lam

在真实业务场景中,数据库中经常需要存储某些客户的关键性敏感信息如:身份证号、银行卡号、姓名、手机号码等,此类信息按照合规要求,通常需要实现加密存储以满足合规要求。

痛点一

通常的解决方案是我们书写SQL的时候,把对应的加密字段手动进行加密再进行插入,在查询的时候使用之前再手动进行解密。此方法固然可行,但是使用起来非常不便捷且繁琐,使得日常的业务开发与存储合规的细节紧耦合。

痛点二

对于一些为了快速上线而一开始没有实现合规脱敏的系统,如何比较快速的使得已有业务满足合规要求的同时,尽量减少对原系统的改造。(通常的这个过程至少包括:

1、 新增脱敏列的存储

2、 同时做数据迁移

3、 业务的代码做兼容逻辑等

Apache ShardingSphere下面存在一个数据脱敏模块,此模块集成的常用的数据脱敏的功能。其基本原理是对用户输入的SQL进行解析拦截,并依靠用户的脱敏配置进行SQL的改写,从而实现对字段的加密及加密字段的解密。最终实现对用户无感的加解密存储、查询。

脱敏配置Quick Start——Spring 显示配置:

以下介绍基于Spring如何快速让系统支持脱敏配置。

1、引入依赖

<!-- for spring namespace --> <dependency>     <groupId>org.apache.shardingsphere</groupId>     <artifactId>sharding-jdbc-spring-namespace</artifactId>     <version>${sharding-sphere.version}</version> </dependency>

讯享网

2、创建脱敏配置规则对象

在创建数据源之前,需要准备一个EncryptRuleConfiguration进行脱敏的配置,以下是一个例子,对于同一个数据源里两张表card_info,pay_order的不同字段进行AES的加密

讯享网private EncryptRuleConfiguration getEncryptRuleConfiguration() { Properties props = new Properties(); //自带aes算法需要 props.setProperty("aes.key.value", aeskey); EncryptorRuleConfiguration encryptorConfig = new EncryptorRuleConfiguration("AES", props); //自定义算法 //props.setProperty("qb.finance.aes.key.value", aeskey); //EncryptorRuleConfiguration encryptorConfig = new EncryptorRuleConfiguration("QB-FINANCE-AES", props); EncryptRuleConfiguration encryptRuleConfig = new EncryptRuleConfiguration(); encryptRuleConfig.getEncryptors().put("aes", encryptorConfig); //START: card_info 表的脱敏配置 {     EncryptColumnRuleConfiguration columnConfig1 = new EncryptColumnRuleConfiguration("", "name", "", "aes");     EncryptColumnRuleConfiguration columnConfig2 = new EncryptColumnRuleConfiguration("", "id_no", "", "aes");     EncryptColumnRuleConfiguration columnConfig3 = new EncryptColumnRuleConfiguration("", "finshell_card_no", "", "aes");     Map<String, EncryptColumnRuleConfiguration> columnConfigMaps = new HashMap<>();     columnConfigMaps.put("name", columnConfig1);     columnConfigMaps.put("id_no", columnConfig2);     columnConfigMaps.put("finshell_card_no", columnConfig3);     EncryptTableRuleConfiguration tableConfig = new EncryptTableRuleConfiguration(columnConfigMaps);     encryptRuleConfig.getTables().put("card_info", tableConfig); } //END: card_info 表的脱敏配置 //START: pay_order 表的脱敏配置 {     EncryptColumnRuleConfiguration columnConfig1 = new EncryptColumnRuleConfiguration("", "card_no", "", "aes");     Map<String, EncryptColumnRuleConfiguration> columnConfigMaps = new HashMap<>();     columnConfigMaps.put("card_no", columnConfig1);     EncryptTableRuleConfiguration tableConfig = new EncryptTableRuleConfiguration(columnConfigMaps);     encryptRuleConfig.getTables().put("pay_order", tableConfig); } log.info("脱敏配置构建完成:{} ", encryptRuleConfig); return encryptRuleConfig; }

说明:

1、 创建 EncryptColumnRuleConfiguration 的时候有四个参数,前两个参数分表叫plainColumn、cipherColumn,其意思是数据库存储里面真实的两个列(明文列、脱敏列),对于新的系统,只需要设置脱敏列即可,所以以上示例为plainColumn为”“。

2、 创建EncryptTableRuleConfiguration 的时候需要传入一个map,这个map存的value即#1中说明的EncryptColumnRuleConfiguration ,而其key则是一个逻辑列,对于新系统,此逻辑列即为真实的脱敏列。Sharding Shpere在拦截到SQL改写的时候,会按照用户的配置,把逻辑列映射为明文列或者脱敏列(默认)如下的示例

ead30ac26b91036a20b2c92af007ea15.png
讯享网

3、使用Sharding Sphere的数据源进行管理

把原始的数据源包装一层

@Bean("tradePlatformDataSource") public DataSource dataSource(@Qualifier("druidDataSource") DataSource ds) throws SQLException {     return EncryptDataSourceFactory.createDataSource(ds, getEncryptRuleConfiguration(), new Properties()); }

脱敏配置Quick Start——Spring Boot版:

以下步骤使用Spring Boot管理,可以仅用配置文件解决:

1、 引入依赖

讯享网<!-- for spring boot --> <dependency> <groupId>org.apache.shardingsphere</groupId>     <artifactId>sharding-jdbc-spring-boot-starter</artifactId>     <version>${sharding-sphere.version}</version> </dependency> <!-- for spring namespace --> <dependency>     <groupId>org.apache.shardingsphere</groupId>     <artifactId>sharding-jdbc-spring-namespace</artifactId>     <version>${sharding-sphere.version}</version> </dependency>

2、 Spring 配置文件

spring.shardingsphere.datasource.name=ds spring.shardingsphere.datasource.ds.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.ds.url=xxxxxxxxxxxxx spring.shardingsphere.datasource.ds.username=xxxxxxx spring.shardingsphere.datasource.ds.password=xxxxxxxxxxxx # 默认的AES加密器 spring.shardingsphere.encrypt.encryptors.encryptor_aes.type=aes spring.shardingsphere.encrypt.encryptors.encryptor_aes.props.aes.key.value=hkiqAXU6Ur5fixGHaO4Lb2V2ggausYwW # card_info 姓名 AES加密 spring.shardingsphere.encrypt.tables.card_info.columns.name.cipherColumn=name spring.shardingsphere.encrypt.tables.card_info.columns.name.encryptor=encryptor_aes # card_info 身份证 AES加密 spring.shardingsphere.encrypt.tables.card_info.columns.id_no.cipherColumn=id_no spring.shardingsphere.encrypt.tables.card_info.columns.id_no.encryptor=encryptor_aes # card_info 银行卡号 AES加密 spring.shardingsphere.encrypt.tables.card_info.columns.finshell_card_no.cipherColumn=finshell_card_no spring.shardingsphere.encrypt.tables.card_info.columns.finshell_card_no.encryptor=encryptor_aes # pay_order 银行卡号 AES加密 spring.shardingsphere.encrypt.tables.pay_order.columns.card_no.cipherColumn=card_no spring.shardingsphere.encrypt.tables.pay_order.columns.card_no.encryptor=encryptor_aes

END

Java 技术学习交流群

 「架构君」建立了读者群,可以添加我微信拉你进群

fb6205f40025406b4e4f2119d7da95a2.png

添加时可以备注城市+职位+年限】

分享一套家庭理财系统(附源码)

2021-09-20

8733fb5feda4da27adf05ebf0bd38ed5.png

推荐一套开源通用后台管理系统(附源码)

2021-08-21

d40095e0fd15080acedd05e1c7193b76.png

推荐一个酷炫的监控系统

2021-08-07

390caec1d205c4c6aa6f3bfd0346ba2a.png

从朋友那里搞了 20 个实战项目,速领!

2021-06-14

5c19220f20f3024065383a3ae23b5dfd.png

推荐一个完善的停车管理系统,物联网项目springboot,附源码

2021-05-30

90439aa304797fb9da5d4e8bd8dab08a.png

推荐一个互联网企业级别的开源支付系统

2021-09-04

9dbc9af41d4af900d20346cd0aa57196.png

一款神仙接私活儿软件,吊到不行!

2021-07-31

c11326f8a48eb07b634cf4a7d0def106.png

推荐 10 款超实用的企业级开源应用!

2021-10-17

fded5e430f238f6b3c12bee4588c5c3f.png

开放平台 SDK 设计实践!

2021-10-13

079d615c85f194c412373611a95c17fd.png

“淘宝” 开放平台接口设计思路

2021-10-07

56203975b4d3d57e31fff6764ce1113d.png

Spring中经典的9种设计模式

2021-10-05

b02c37fd56ee06edc7508f2b869750bd.png

3c2aded039470142026f99678ef18bdb.png

如有收获,点个在看,诚挚感谢b12cc4c3df18f947929a019c0fafa54c.png

小讯
上一篇 2025-04-11 10:50
下一篇 2025-01-07 10:26

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/63371.html