当前位置: 首页 > 后端技术 > Java

基于ShardingSphere,实现数据“一键脱敏”!

时间:2023-04-01 19:53:45 Java

来源:https://jaskey.github.io/blog...在实际业务场景中,往往需要在数据库中存储客户的一些关键敏感信息,比如:身份证号,银行卡号,姓名、手机号码等。根据合规要求,此类信息通常需要加密存储,以满足合规要求。痛点一:通常的解决方法是,我们在写SQL的时候,手动将对应的加密字段加密后再插入,查询的时候再手动解密再使用。这种方式当然可行,但是使用起来非常不方便和繁琐,使得日常业务开发和存储合规的细节紧密耦合。痛点二:对于一些一开始就没有实施合规脱敏的系统,为了快速上线,如何在更快的让现有业务满足合规要求的同时,尽量减少对原有系统的改造。(通常这个过程至少包括:1.添加脱敏列存储2.同步数据迁移3.业务代码兼容逻辑等)。ApacheShardingSphere下有一个数据屏蔽模块,集成了常用的数据屏蔽功能。基本原理是对用户输入的SQL进行分析拦截,根据用户的脱敏配置对SQL进行改写,从而实现对原文字段的加密和加密字段的解密。最终实现对用户不敏感的加密、解密、存储和查询。脱敏配置快速入门——Spring显示配置:下面介绍如何基于Spring快速让系统支持脱敏配置。1.引入依赖org.apache.shardingspheresharding-jdbc-spring-namespace${sharding-sphere.version}2.创建脱敏配置规则对象在创建数据源之前,需要准备一个EncryptRuleConfiguration,用于脱敏配置。下面是一个例子,对于同一个数据源中的两个表card_info和pay_order的不同字段进行了AES加密privateEncryptRuleConfigurationgetEncryptRuleConfiguration(){//AES算法需要props.setProperty("aes.key.value",aeskey);EncryptorRuleConfigurationencryptorConfig=newEncryptorRuleConfiguration("AES",道具);//自定义算法//props.setProperty("qb.finance.aes.key.value",aeskey);//EncryptorRuleConfigurationencryptorConfig=newEncryptorRuleConfiguration("QB-FINANCE-AES",props);EncryptRuleConfigurationencryptRuleConfig=newEncryptRuleConfiguration();encryptRuleConfig.getEncryptors().put("aes",encryptorCon如图);//START:card_info表的脱敏配置{EncryptColumnRuleConfigurationcolumnConfig1=newEncryptColumnRuleConfiguration("","name","","aes");EncryptColumnRuleConfigurationcolumnConfig2=newEncryptColumnRuleConfiguration("","id_no","","aes");EncryptColumnRuleConfigurationcolumnConfig3=newEncryptColumnRuleConfiguration("","finshell_card_no","","aes");MapcolumnConfigMaps=newHashMap<>();columnConfigMaps.put("名称",columnConfig1);columnConfigMaps.put("id_no",columnConfig2);columnConfigMaps.put("finshell_card_no",columnConfig3);EncryptTableRuleConfigurationtableConfig=newEncryptTableRuleConfiguration(columnConfigMaps);encryptRuleConfig.getTables().put("card_info",tableConfig);}//END:card_info表的脱敏配置//START:pay_order表的脱敏配置{EncryptColumnRuleConfigurationcolumnConfig1=newEncryptColumnRuleConfiguration("","card_no","","aes");MapcolumnConfigMaps=newHashMap<>();columnConfigMaps.put("card_no",columnConfig1);EncryptTableRuleConfigurationtableConfig=newEncryptTableRuleConfig);encryptRuleConfig.getTables().put("pay_order",tableConfig);}log.info("脱敏配置构建完成:{}",encryptRuleConfig);returnencryptRuleConfig;}注意:创建EncryptColumnRuleConfiguration时有四个参数,前两个参数子表分别称为plainColumn和cipherColumn,表示数据库存储中真正的两列(名称文本列,脱敏列)。对于新系统,只需要设置脱敏列,所以上面的例子在为plainColumn""创建EncryptTableRuleConfiguration时,需要传入一个map。此映射中存储的值是#1中描述的EncryptColumnRuleConfiguration,其键是一个逻辑列。对于新系统来说,这个逻辑栏目才是真正的脱敏List。ShardingShpere在拦截SQL重写时,会根据用户的配置,将逻辑列映射为命名文本列或脱敏列(默认)。示例3.使用ShardingSphere的数据源对原始数据源进行管理和封装一层@Bean("tradePlatformDataSource")publicDataSourcedataSource(@Qualifier("druidDataSource")DataSourceds)throwsSQLException{returnEncryptDataSourceFactory.createDataSource(ds,getEncryptRuleConfiguration(),新属性());}脱敏配置快速入门——SpringBoot版本:以下步骤由SpringBoot管理,只用配置文件即可解决:1.引入依赖org.apache.shardingspheresharding-jdbc-spring-boot-starter${sharding-sphere.version}org.apache.shardingspheresharding-jdbc-spring-namespace<版本>${sharding-sphere.version}2.Spring配置文件spring.shardingsphere.datasource.name=dsspring.shardingsphere.datasource.ds.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.ds.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource。ds.url=xxxxxxxxxxxxxspring.shardingsphere.datasource.ds.username=xxxxxxxspring.shardingsphere.datasource.ds.password=xxxxxxxxxxxx#默认的AES加密器spring.shardingsphere.encrypt.encryptors.encryptor_aes.type=aessspring.shardingsphere.encrypt.encryptors.encryptor_aes.props.aes.key.value=hkiqAXU6Ur5fixGHaO4Lb2V2ggausYwW#card_info名称AES加密#card_info身份证明AES加密spring.shardingsphere.encrypt.tables.card_info.columns.id_no.cipherColumn=id_nospring.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_nospring.shardingsphere.encrypt.tables.card_info.columns.finshell_card_no.encryptor=encryptor_aes#pay_order银行卡号的AES加密spring.shardingsphere.encrypt.tables.pay_order.columns.card_no.cipher_Column=cipher_Column.tables.pay_order.columns.card_no.encryptor=encryptor_aes近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.终于从开源项目拿到IntelliJIDEA激活码了,真香!3、阿里Mock工具正式开源,秒杀市面上所有Mock工具!4、SpringCloud2020.0.0正式发布,全新颠覆版本!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!