使用SpringBoot整合Sharding Sphere實(shí)現(xiàn)數(shù)據(jù)脫敏的示例
在真實(shí)業(yè)務(wù)場景中,數(shù)據(jù)庫中經(jīng)常需要存儲(chǔ)某些客戶的關(guān)鍵性敏感信息如:身份證號、銀行卡號、姓名、手機(jī)號碼等,此類信息按照合規(guī)要求,通常需要實(shí)現(xiàn)加密存儲(chǔ)以滿足合規(guī)要求。
痛點(diǎn)一:
通常的解決方案是書寫SQL的時(shí)候,把對應(yīng)的加密字段手動(dòng)進(jìn)行加密再進(jìn)行插入,在查詢的時(shí)候使用之前再手動(dòng)進(jìn)行解密。此方法固然可行,但是使用起來非常不便捷且繁瑣,使得日常的業(yè)務(wù)開發(fā)與存儲(chǔ)合規(guī)的細(xì)節(jié)緊耦合
痛點(diǎn)二:
對于一些為了快速上線而一開始沒有實(shí)現(xiàn)合規(guī)脫敏的系統(tǒng),如何比較快速的使得已有業(yè)務(wù)滿足合規(guī)要求的同時(shí),盡量減少對原系統(tǒng)的改造。(通常的這個(gè)過程至少包括:1.新增脫敏列的存儲(chǔ) 2.同時(shí)做數(shù)據(jù)遷移 3.業(yè)務(wù)的代碼做兼容邏輯等)。
Apache ShardingSphere下面存在一個(gè)數(shù)據(jù)脫敏模塊,此模塊集成的常用的數(shù)據(jù)脫敏的功能。其基本原理是對用戶輸入的SQL進(jìn)行解析攔截,并依靠用戶的脫敏配置進(jìn)行SQL的改寫,從而實(shí)現(xiàn)對原文字段的加密及加密字段的解密。最終實(shí)現(xiàn)對用戶無感的加解密存儲(chǔ)、查詢。
脫敏配置Quick Start——Spring 顯示配置:
以下介紹基于Spring如何快速讓系統(tǒng)支持脫敏配置。
1.引入依賴
<!-- for spring namespace --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>${sharding-sphere.version}</version> </dependency>
2.創(chuàng)建脫敏配置規(guī)則對象
在創(chuàng)建數(shù)據(jù)源之前,需要準(zhǔn)備一個(gè) EncryptRuleConfiguration
進(jìn)行脫敏的配置,以下是一個(gè)例子,對于同一個(gè)數(shù)據(jù)源里兩張表card_info
,pay_order
的不同字段進(jìn)行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("脫敏配置構(gòu)建完成:{} ", encryptRuleConfig); return encryptRuleConfig; }
說明:
- 創(chuàng)建
EncryptColumnRuleConfiguration
的時(shí)候有四個(gè)參數(shù),前兩個(gè)參數(shù)分表叫plainColumn
、cipherColumn
,其意思是數(shù)據(jù)庫存儲(chǔ)里面真實(shí)的兩個(gè)列(名文列、脫敏列),對于新的系統(tǒng),只需要設(shè)置脫敏列即可,所以以上示例為plainColumn
為””。 - 創(chuàng)建
EncryptTableRuleConfiguration
的時(shí)候需要傳入一個(gè)map,這個(gè)map存的value即#1中說明的EncryptColumnRuleConfiguration
,而其key則是一個(gè)邏輯列,對于新系統(tǒng),此邏輯列即為真實(shí)的脫敏列。Sharding Shpere在攔截到SQL改寫的時(shí)候,會(huì)按照用戶的配置,把邏輯列映射為名文列或者脫敏列(默認(rèn))如下的示例
3.使用Sharding Sphere的數(shù)據(jù)源進(jìn)行管理
把原始的數(shù)據(jù)源包裝一層
@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 # 默認(rèn)的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
到此這篇關(guān)于如何用SpringBoot整合Sharding Sphere實(shí)現(xiàn)數(shù)據(jù)脫敏的文章就介紹到這了,更多相關(guān)SpringBoot Sharding Sphere數(shù)據(jù)脫敏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+?Sharding?Sphere?輕松實(shí)現(xiàn)數(shù)據(jù)庫字段加解密功能
- SpringBoot?整合?ShardingSphere4.1.1實(shí)現(xiàn)分庫分表功能
- springboot如何使用yml文件方式配置shardingsphere
- SpringBoot整合ShardingSphere5.x實(shí)現(xiàn)數(shù)據(jù)加解密功能(最新推薦)
- SpringBoot整合ShardingSphere的示例代碼
- Springboot2.x+ShardingSphere實(shí)現(xiàn)分庫分表的示例代碼
- SpringBoot接口返回?cái)?shù)據(jù)脫敏(Mybatis、Jackson)
- Springboot+Jackson自定義注解數(shù)據(jù)脫敏的項(xiàng)目實(shí)踐
相關(guān)文章
SpringBoot集成selenium實(shí)現(xiàn)自動(dòng)化測試的代碼工程
Selenium?是支持web?瀏覽器自動(dòng)化的一系列工具和[庫]?它提供了擴(kuò)展來模擬用戶與瀏覽器的交互,用于擴(kuò)展瀏覽器分配的分發(fā),本文給大家介紹了SpringBoot集成selenium實(shí)現(xiàn)自動(dòng)化測試的代碼工程,需要的朋友可以參考下2024-08-08Spring Security異步無法獲取用戶認(rèn)證信息的解決方法
最近使用 Springboot 中 @Async 注解異步調(diào)用方法時(shí),發(fā)現(xiàn)無法獲取到用戶認(rèn)證信息,本文小編給大家介紹了Spring Security異步無法獲取用戶認(rèn)證信息的原因和解決方法,并通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09SpringBoot如何實(shí)現(xiàn)同域SSO(單點(diǎn)登錄)
單點(diǎn)登錄(SingleSignOn,SSO),就是通過用戶的一次性鑒別登錄。即在多個(gè)應(yīng)用系統(tǒng)中,只需要登錄一次,就可以訪問其他相互信任的應(yīng)用系統(tǒng),本文將介紹SpringBoot如何實(shí)現(xiàn)同域SSO(單點(diǎn)登錄)2021-05-05Intellij IDEA命令行執(zhí)行java無法加載主類解決方案
這篇文章主要介紹了Intellij IDEA命令行執(zhí)行java無法加載主類解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Spring Security permitAll()不允許匿名訪問的操作
這篇文章主要介紹了Spring Security permitAll()不允許匿名訪問的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java聊天室之實(shí)現(xiàn)使用Socket傳遞音頻
這篇文章主要為大家詳細(xì)介紹了Java簡易聊天室之使用Socket實(shí)現(xiàn)傳遞音頻功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下2022-10-10Nacos通過RefreshScope實(shí)現(xiàn)配置自動(dòng)更新的方式分享
這篇文章主要給大家介紹了Nacos如何通過RefreshScope實(shí)現(xiàn)配置自動(dòng)更新,文中給了兩種實(shí)現(xiàn)方式供大家參考,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-09-09Java 在Excel單元格中應(yīng)用一種/多種字體樣式(實(shí)例代碼)
這篇文章主要介紹了Java 在Excel單元格中應(yīng)用一種/多種字體樣式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Maven工程引入依賴失敗Dependencies全部飄紅問題
這篇文章主要介紹了Maven工程引入依賴失敗Dependencies全部飄紅問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08