欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

透明化Sharding-JDBC數(shù)據(jù)庫(kù)字段加解密方案

 更新時(shí)間:2022年02月24日 09:56:06   作者:kl  
這篇文章主要為大家介紹了透明化Sharding-JDBC數(shù)據(jù)庫(kù)字段加解密方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

近期,博主公司應(yīng)安全審計(jì)要求,需要對(duì)數(shù)據(jù)庫(kù)中的用戶關(guān)鍵信息做加密處理,這樣,即使生產(chǎn)數(shù)據(jù)被脫褲,也不會(huì)泄露用戶的敏感信息,在做了初步的需求歸納和功能分析后,我們制定了簡(jiǎn)單的開發(fā)方案,將需要加解密的字段的元數(shù)據(jù)信息通過(guò)配置或注解的方式標(biāo)記出來(lái),嘗試使用hibernate的filter和Interceptor針對(duì)用戶sql做攔截,做到透明化加解密。但是這個(gè)方案很快被否決了,查詢結(jié)果集沒(méi)法通過(guò)這種方式達(dá)到目的。然后將方向轉(zhuǎn)向了代理JDBC驅(qū)動(dòng)的方式。

在摸索JDBC代理方案過(guò)程中發(fā)現(xiàn),業(yè)界已經(jīng)有了非常成熟的針對(duì)數(shù)據(jù)庫(kù)字段透明化加解密的方案,而且和我們場(chǎng)景以及方案非常相符,整體方案如下:

背景

安全控制一直是治理的重要環(huán)節(jié),數(shù)據(jù)脫敏屬于安全控制的范疇。對(duì)互聯(lián)網(wǎng)公司、傳統(tǒng)行業(yè)來(lái)說(shuō),數(shù)據(jù)安全一直是極為重視和敏感的話題。數(shù)據(jù)脫敏是指對(duì)某些敏感信息通過(guò)脫敏規(guī)則進(jìn)行數(shù)據(jù)的變形,實(shí)現(xiàn)敏感隱私數(shù)據(jù)的可靠保護(hù)。涉及客戶安全數(shù)據(jù)或者一些商業(yè)性敏感數(shù)據(jù),如身份證號(hào)、手機(jī)號(hào)、卡號(hào)、客戶號(hào)等個(gè)人信息按照相關(guān)部門規(guī)定,都需要進(jìn)行數(shù)據(jù)脫敏。

在真實(shí)業(yè)務(wù)場(chǎng)景中,相關(guān)業(yè)務(wù)開發(fā)團(tuán)隊(duì)則往往需要針對(duì)公司安全部門需求,自行實(shí)行并維護(hù)一套加解密系統(tǒng),而當(dāng)脫敏場(chǎng)景發(fā)生改變時(shí),自行維護(hù)的脫敏系統(tǒng)往往又面臨著重構(gòu)或修改風(fēng)險(xiǎn)。此外,對(duì)于已經(jīng)上線的業(yè)務(wù),如何在不修改業(yè)務(wù)邏輯、業(yè)務(wù)SQL的情況下,透明化、安全低風(fēng)險(xiǎn)地實(shí)現(xiàn)無(wú)縫進(jìn)行脫敏改造呢?

Apache ShardingSphere根據(jù)業(yè)界對(duì)脫敏的需求及業(yè)務(wù)改造痛點(diǎn),提供了一套完整、安全、透明化、低改造成本的數(shù)據(jù)脫敏整合解決方案。

前序

Apache ShardingSphere是一套開源的分布式數(shù)據(jù)庫(kù)中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(規(guī)劃中)這3款相互獨(dú)立,卻又能夠混合部署配合使用的產(chǎn)品組成。它們均能夠提供標(biāo)準(zhǔn)化的數(shù)據(jù)分片、分布式事務(wù)和分布式治理功能,可適用于如Java同構(gòu)、異構(gòu)語(yǔ)言、容器、云原生等各種多樣化的應(yīng)用場(chǎng)景。

數(shù)據(jù)脫敏模塊屬于ShardingSphere分布式治理這一核心功能下的子功能模塊。它通過(guò)對(duì)用戶輸入的SQL進(jìn)行解析,并依據(jù)用戶提供的脫敏配置對(duì)SQL進(jìn)行改寫,從而實(shí)現(xiàn)對(duì)原文數(shù)據(jù)進(jìn)行加密,并將原文數(shù)據(jù)(可選)及密文數(shù)據(jù)同時(shí)存儲(chǔ)到底層數(shù)據(jù)庫(kù)。在用戶查詢數(shù)據(jù)時(shí),它又從數(shù)據(jù)庫(kù)中取出密文數(shù)據(jù),并對(duì)其解密,最終將解密后的原始數(shù)據(jù)返回給用戶。Apache ShardingSphere分布式數(shù)據(jù)庫(kù)中間件自動(dòng)化&透明化了數(shù)據(jù)脫敏過(guò)程,讓用戶無(wú)需關(guān)注數(shù)據(jù)脫敏的實(shí)現(xiàn)細(xì)節(jié),像使用普通數(shù)據(jù)那樣使用脫敏數(shù)據(jù)。此外,無(wú)論是已在線業(yè)務(wù)進(jìn)行脫敏改造,還是新上線業(yè)務(wù)使用脫敏功能,ShardingSphere都可以提供一套相對(duì)完善的解決方案。

需求場(chǎng)景分析

對(duì)于數(shù)據(jù)脫敏的需求,在現(xiàn)實(shí)的業(yè)務(wù)場(chǎng)景中一般分為兩種情況:

1.新業(yè)務(wù)上線,安全部門規(guī)定需將涉及用戶敏感信息,例如銀行、手機(jī)號(hào)碼等進(jìn)行加密后存儲(chǔ)到數(shù)據(jù)庫(kù),在使用的時(shí)候再進(jìn)行解密處理。因?yàn)槭侨孪到y(tǒng),因而沒(méi)有存量數(shù)據(jù)清洗問(wèn)題,所以實(shí)現(xiàn)相對(duì)簡(jiǎn)單。

2.已上線業(yè)務(wù),之前一直將明文存儲(chǔ)在數(shù)據(jù)庫(kù)中。相關(guān)部門突然需要對(duì)已上線業(yè)務(wù)進(jìn)行脫敏整改。這種場(chǎng)景一般需要處理三個(gè)問(wèn)題:

  • a) 歷史數(shù)據(jù)需要如何進(jìn)行脫敏處理,即洗數(shù)。
  • b) 如何能在不改動(dòng)業(yè)務(wù)SQL和邏輯情況下,將新增數(shù)據(jù)進(jìn)行脫敏處理,并存儲(chǔ)到數(shù)據(jù)庫(kù);在使用時(shí),再進(jìn)行解密取出。
  • c) 如何較為安全、無(wú)縫、透明化地實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)在明文與密文數(shù)據(jù)間的遷移。

處理流程詳解

整體架構(gòu)

ShardingSphere提供的Encrypt-JDBC和業(yè)務(wù)代碼部署在一起。業(yè)務(wù)方需面向Encrypt-JDBC進(jìn)行JDBC編程。由于Encrypt-JDBC實(shí)現(xiàn)所有JDBC標(biāo)準(zhǔn)接口,業(yè)務(wù)代碼無(wú)需做額外改造即可兼容使用。此時(shí),業(yè)務(wù)代碼所有與數(shù)據(jù)庫(kù)的交互行為交由Encrypt-JDBC負(fù)責(zé)。業(yè)務(wù)只需提供脫敏規(guī)則即可。作為業(yè)務(wù)代碼與底層數(shù)據(jù)庫(kù)中間的橋梁,Encrypt-JDBC便可攔截用戶行為,并在改造行為后與數(shù)據(jù)庫(kù)交互。

Encrypt-JDBC將用戶發(fā)起的SQL進(jìn)行攔截,并通過(guò)SQL語(yǔ)法解析器進(jìn)行解析、理解SQL行為,再依據(jù)用戶傳入的脫敏規(guī)則,找出需要脫敏的字段和所使用的加解密器對(duì)目標(biāo)字段進(jìn)行加解密處理后,再與底層數(shù)據(jù)庫(kù)進(jìn)行交互。ShardingSphere會(huì)將用戶請(qǐng)求的明文進(jìn)行加密后存儲(chǔ)到底層數(shù)據(jù)庫(kù);并在用戶查詢時(shí),將密文從數(shù)據(jù)庫(kù)中取出進(jìn)行解密后返回給終端用戶。ShardingSphere通過(guò)屏蔽對(duì)數(shù)據(jù)的脫敏處理,使用戶無(wú)需感知解析SQL、數(shù)據(jù)加密、數(shù)據(jù)解密的處理過(guò)程,就像在使用普通數(shù)據(jù)一樣使用脫敏數(shù)據(jù)。

脫敏規(guī)則

在詳解整套流程之前,我們需要先了解下脫敏規(guī)則與配置,這是認(rèn)識(shí)整套流程的基礎(chǔ)。脫敏配置主要分為四部分:數(shù)據(jù)源配置,加密器配置,脫敏表配置以及查詢屬性配置,其詳情如下圖所示:

數(shù)據(jù)源配置:是指DataSource的配置。

加密器配置:是指使用什么加密策略進(jìn)行加解密。目前ShardingSphere內(nèi)置了兩種加解密策略:AES/MD5。用戶還可以通過(guò)實(shí)現(xiàn)ShardingSphere提供的接口,自行實(shí)現(xiàn)一套加解密算法。

脫敏表配置:用于告訴ShardingSphere數(shù)據(jù)表里哪個(gè)列用于存儲(chǔ)密文數(shù)據(jù)(cipherColumn)、哪個(gè)列用于存儲(chǔ)明文數(shù)據(jù)(plainColumn)以及用戶想使用哪個(gè)列進(jìn)行SQL編寫(logicColumn)。

如何理解用戶想使用哪個(gè)列進(jìn)行SQL編寫(logicColumn)?

我們可以從Encrypt-JDBC存在的意義來(lái)理解。Encrypt-JDBC最終目的是希望屏蔽底層對(duì)數(shù)據(jù)的脫敏處理,也就是說(shuō)我們不希望用戶知道數(shù)據(jù)是如何被加解密的、如何將明文數(shù)據(jù)存儲(chǔ)到plainColumn,將密文數(shù)據(jù)存儲(chǔ)到cipherColumn。換句話說(shuō),我們不希望用戶知道plainColumn和cipherColumn的存在和使用。所以,我們需要給用戶提供一個(gè)概念意義上的列,這個(gè)列可以脫離底層數(shù)據(jù)庫(kù)的真實(shí)列,它可以是數(shù)據(jù)庫(kù)表里的一個(gè)真實(shí)列,也可以不是,從而使得用戶可以隨意改變底層數(shù)據(jù)庫(kù)的plainColumn和cipherColumn的列名?;蛘邉h除plainColumn,選擇永遠(yuǎn)不再存儲(chǔ)明文,只存儲(chǔ)密文。只要用戶的SQL面向這個(gè)邏輯列進(jìn)行編寫,并在脫敏規(guī)則里給出logicColumn和plainColumn、cipherColumn之間正確的映射關(guān)系即可。

為什么要這么做呢?答案在文章后面,即為了讓已上線的業(yè)務(wù)能無(wú)縫、透明、安全地進(jìn)行數(shù)據(jù)脫敏遷移。

查詢屬性的配置:當(dāng)?shù)讓訑?shù)據(jù)庫(kù)表里同時(shí)存儲(chǔ)了明文數(shù)據(jù)、密文數(shù)據(jù)后,該屬性開關(guān)用于決定是直接查詢數(shù)據(jù)庫(kù)表里的明文數(shù)據(jù)進(jìn)行返回,還是查詢密文數(shù)據(jù)通過(guò)Encrypt-JDBC解密后返回。

脫敏處理過(guò)程

舉個(gè)栗子,假如數(shù)據(jù)庫(kù)里有一張表叫做t_user,這張表里實(shí)際有兩個(gè)字段pwd_plain,用于存放明文數(shù)據(jù)、pwd_cipher,用于存放密文數(shù)據(jù),同時(shí)定義logicColumn為pwd。那么,用戶在編寫SQL時(shí)應(yīng)該面向logicColumn進(jìn)行編寫,即INSERT INTO t_user SET pwd = ‘123’。ShardingSphere接收到該SQL,通過(guò)用戶提供的脫敏配置,發(fā)現(xiàn)pwd是logicColumn,于是便對(duì)邏輯列及其對(duì)應(yīng)的明文數(shù)據(jù)進(jìn)行脫敏處理??梢钥闯?*ShardingSphere將面向用戶的邏輯列與面向底層數(shù)據(jù)庫(kù)的明文列和密文列進(jìn)行了列名以及數(shù)據(jù)的脫敏映射轉(zhuǎn)換。**如下圖所示:

**這也正是Encrypt-JDBC核心意義所在,即依據(jù)用戶提供的脫敏規(guī)則,將用戶SQL與底層數(shù)據(jù)表結(jié)構(gòu)割裂開來(lái),使得用戶的SQL編寫不再依賴于真實(shí)的數(shù)據(jù)庫(kù)表結(jié)構(gòu)。而用戶與底層數(shù)據(jù)庫(kù)之間的銜接、映射、轉(zhuǎn)換交由ShardingSphere進(jìn)行處理。**為什么我們要這么做?還是那句話:為了讓已上線的業(yè)務(wù)能無(wú)縫、透明、安全地進(jìn)行數(shù)據(jù)脫敏遷移。

為了讓讀者更清晰了解到Encrypt-JDBC的核心處理流程,下方圖片展示了使用Encrypt-JDBC進(jìn)行增刪改查時(shí),其中的處理流程和轉(zhuǎn)換邏輯,如下圖所示。

解決方案詳解

在了解了ShardingSphere脫敏處理流程后,即可將脫敏配置、脫敏處理流程與實(shí)際場(chǎng)景進(jìn)行結(jié)合。所有的設(shè)計(jì)開發(fā)都是為了解決業(yè)務(wù)場(chǎng)景遇到的痛點(diǎn)。那么面對(duì)之前提到的業(yè)務(wù)場(chǎng)景需求,又應(yīng)該如何使用ShardingSphere這把利器來(lái)滿足業(yè)務(wù)需求呢?

新上線業(yè)務(wù)

業(yè)務(wù)場(chǎng)景分析:新上線業(yè)務(wù)由于一切從零開始,不存在歷史數(shù)據(jù)清洗問(wèn)題,所以相對(duì)簡(jiǎn)單。

解決方案說(shuō)明:選擇合適的加密器,如AES后,只需配置邏輯列(面向用戶編寫SQL)和密文列(數(shù)據(jù)表存密文數(shù)據(jù))即可,邏輯列和密文列可以相同也可以不同。建議配置如下(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進(jìn)行轉(zhuǎn)換,底層數(shù)據(jù)表不存儲(chǔ)明文,只存儲(chǔ)了密文,這也是安全審計(jì)部分的要求所在。如果用戶希望將明文、密文一同存儲(chǔ)到數(shù)據(jù)庫(kù),只需添加plainColumn配置即可。整體處理流程如下圖所示:

已上線業(yè)務(wù)改造

業(yè)務(wù)場(chǎng)景分析:由于業(yè)務(wù)已經(jīng)在線上運(yùn)行,數(shù)據(jù)庫(kù)里必然存有大量明文歷史數(shù)據(jù)?,F(xiàn)在的問(wèn)題是如何讓歷史數(shù)據(jù)得以加密清洗、如何讓增量數(shù)據(jù)得以加密處理、如何讓業(yè)務(wù)在新舊兩套數(shù)據(jù)系統(tǒng)之間進(jìn)行無(wú)縫、透明化遷移。

解決方案說(shuō)明:在提供解決方案之前,我們先來(lái)頭腦風(fēng)暴一下:首先,既然是舊業(yè)務(wù)需要進(jìn)行脫敏改造,那一定存儲(chǔ)了非常重要且敏感的信息。這些信息含金量高且業(yè)務(wù)相對(duì)基礎(chǔ)重要。如果搞錯(cuò)了,整個(gè)團(tuán)隊(duì)KPI就再見了。所以不可能一上來(lái)就停業(yè)務(wù),禁止新數(shù)據(jù)寫入,再找個(gè)加密器把歷史數(shù)據(jù)全部加密清洗,再把之前重構(gòu)的代碼部署上線,使其能把存量和增量數(shù)據(jù)進(jìn)行在線加密解密。如此簡(jiǎn)單粗暴的方式,按照歷史經(jīng)驗(yàn)來(lái)談,一定涼涼。

那么另一種相對(duì)安全的做法是:重新搭建一套和生產(chǎn)環(huán)境一模一樣的預(yù)發(fā)環(huán)境,然后通過(guò)相關(guān)遷移洗數(shù)工具把生產(chǎn)環(huán)境的存量原文數(shù)據(jù)加密后存儲(chǔ)到預(yù)發(fā)環(huán)境,而新增數(shù)據(jù)則通過(guò)例如MySQL主從復(fù)制及業(yè)務(wù)方自行開發(fā)的工具加密后存儲(chǔ)到預(yù)發(fā)環(huán)境的數(shù)據(jù)庫(kù)里,再把重構(gòu)后可以進(jìn)行加解密的代碼部署到預(yù)發(fā)環(huán)境。這樣生產(chǎn)環(huán)境是一套以明文為核心的查詢修改的環(huán)境;預(yù)發(fā)環(huán)境是一套以密文為核心加解密查詢修改的環(huán)境。在對(duì)比一段時(shí)間無(wú)誤后,可以夜間操作將生產(chǎn)流量切到預(yù)發(fā)環(huán)境中。此方案相對(duì)安全可靠,只是時(shí)間、人力、資金、成本較高,主要包括:預(yù)發(fā)環(huán)境搭建、生產(chǎn)代碼整改、相關(guān)輔助工具開發(fā)等。除非無(wú)路可走,否則業(yè)務(wù)開發(fā)人員一般是從入門到放棄。

業(yè)務(wù)開發(fā)人員最希望的做法是:減少資金費(fèi)用的承擔(dān)、最好不要修改業(yè)務(wù)代碼、能夠安全平滑遷移系統(tǒng)。于是,ShardingSphere的脫敏功能模塊便應(yīng)用而生??煞譃槿竭M(jìn)行:

系統(tǒng)遷移前

假設(shè)系統(tǒng)需要對(duì)t_user的pwd字段進(jìn)行脫敏處理,業(yè)務(wù)方使用Encrypt-JDBC來(lái)代替標(biāo)準(zhǔn)化的JDBC接口,此舉基本不需要額外改造(我們還提供了SpringBoot,SpringNameSpace,Yaml等接入方式,滿足不同業(yè)務(wù)方需求)。另外,提供一套脫敏配置規(guī)則,如下所示:

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

依據(jù)上述脫敏規(guī)則可知,首先需要在數(shù)據(jù)庫(kù)表t_user里新增一個(gè)字段叫做pwd_cipher,即cipherColumn,用于存放密文數(shù)據(jù),同時(shí)我們把plainColumn設(shè)置為pwd,用于存放明文數(shù)據(jù),而把logicColumn也設(shè)置為pwd。由于之前的代碼SQL就是使用pwd進(jìn)行編寫,即面向邏輯列進(jìn)行SQL編寫,所以業(yè)務(wù)代碼無(wú)需改動(dòng)。通過(guò)Encrypt-JDBC,針對(duì)新增的數(shù)據(jù),會(huì)把明文寫到pwd列,并同時(shí)把明文進(jìn)行加密存儲(chǔ)到pwd_cipher列。此時(shí),由于query.with.cipher.column設(shè)置為false,對(duì)業(yè)務(wù)應(yīng)用來(lái)說(shuō),依舊使用pwd這一明文列進(jìn)行查詢存儲(chǔ),卻在底層數(shù)據(jù)庫(kù)表pwd_cipher上額外存儲(chǔ)了新增數(shù)據(jù)的密文數(shù)據(jù),其處理流程如下圖所示:

新增數(shù)據(jù)在插入時(shí),就通過(guò)Encrypt-JDBC加密為密文數(shù)據(jù),并被存儲(chǔ)到了cipherColumn。而現(xiàn)在就需要處理歷史明文存量數(shù)據(jù)。由于Apache ShardingSphere目前并未提供相關(guān)遷移洗數(shù)工具,此時(shí)需要業(yè)務(wù)方自行將pwd中的明文數(shù)據(jù)進(jìn)行加密處理存儲(chǔ)到pwd_cipher。

系統(tǒng)遷移中

新增的數(shù)據(jù)已被Encrypt-JDBC將密文存儲(chǔ)到密文列,明文存儲(chǔ)到明文列;歷史數(shù)據(jù)被業(yè)務(wù)方自行加密清洗后,將密文也存儲(chǔ)到密文列。也就是說(shuō)現(xiàn)在的數(shù)據(jù)庫(kù)里即存放著明文也存放著密文,只是由于配置項(xiàng)中的query.with.cipher.column=false,所以密文一直沒(méi)有被使用過(guò)。現(xiàn)在我們?yōu)榱俗屜到y(tǒng)能切到密文數(shù)據(jù)進(jìn)行查詢,需要將脫敏配置中的query.with.cipher.column設(shè)置為true。在重啟系統(tǒng)后,我們發(fā)現(xiàn)系統(tǒng)業(yè)務(wù)一切正常,但是Encrypt-JDBC已經(jīng)開始從數(shù)據(jù)庫(kù)里取出密文列的數(shù)據(jù),解密后返回給用戶;而對(duì)于用戶的增刪改需求,則依舊會(huì)把原文數(shù)據(jù)存儲(chǔ)到明文列,加密后密文數(shù)據(jù)存儲(chǔ)到密文列。

雖然現(xiàn)在業(yè)務(wù)系統(tǒng)通過(guò)將密文列的數(shù)據(jù)取出,解密后返回;但是,在存儲(chǔ)的時(shí)候仍舊會(huì)存一份原文數(shù)據(jù)到明文列,這是為什么呢?答案是:為了能夠進(jìn)行系統(tǒng)回滾。**因?yàn)橹灰芪暮兔魑挠肋h(yuǎn)同時(shí)存在,我們就可以通過(guò)開關(guān)項(xiàng)配置自由將業(yè)務(wù)查詢切換到cipherColumn或plainColumn。**也就是說(shuō),如果將系統(tǒng)切到密文列進(jìn)行查詢時(shí),發(fā)現(xiàn)系統(tǒng)報(bào)錯(cuò),需要回滾。那么只需將query.with.cipher.column=false,Encrypt-JDBC將會(huì)還原,即又重新開始使用plainColumn進(jìn)行查詢。處理流程如下圖所示:

系統(tǒng)遷移后

由于安全審計(jì)部門要求,業(yè)務(wù)系統(tǒng)一般不可能讓數(shù)據(jù)庫(kù)的明文列和密文列永久同步保留,我們需要在系統(tǒng)穩(wěn)定后將明文列數(shù)據(jù)刪除。即我們需要在系統(tǒng)遷移后將plainColumn,即pwd進(jìn)行刪除。那問(wèn)題來(lái)了,現(xiàn)在業(yè)務(wù)代碼都是面向pwd進(jìn)行編寫SQL的,把底層數(shù)據(jù)表中的存放明文的pwd刪除了,換用pwd_cipher進(jìn)行解密得到原文數(shù)據(jù),那豈不是意味著業(yè)務(wù)方需要整改所有SQL,從而不使用即將要被刪除的pwd列?還記得我們Encrypt-JDBC的核心意義所在嗎?

這也正是Encrypt-JDBC核心意義所在,即依據(jù)用戶提供的脫敏規(guī)則,將用戶SQL與底層數(shù)據(jù)庫(kù)表結(jié)構(gòu)割裂開來(lái),使得用戶的SQL編寫不再依賴于真實(shí)的數(shù)據(jù)庫(kù)表結(jié)構(gòu)。而用戶與底層數(shù)據(jù)庫(kù)之間的銜接、映射、轉(zhuǎn)換交由ShardingSphere進(jìn)行處理。

是的,因?yàn)橛衛(wèi)ogicColumn存在,用戶的編寫SQL都面向這個(gè)虛擬列,Encrypt-JDBC就可以把這個(gè)邏輯列和底層數(shù)據(jù)表中的密文列進(jìn)行映射轉(zhuǎn)換。于是遷移后的脫敏配置即為:

其處理流程如下:

至此,已在線業(yè)務(wù)脫敏整改解決方案全部敘述完畢。我們提供了Java、Yaml、SpringBoot、SpringNameSpace多種方式供用戶選擇接入,力求滿足業(yè)務(wù)不同的接入需求。該解決方案目前已在京東數(shù)科不斷落地上線,提供對(duì)內(nèi)基礎(chǔ)服務(wù)支撐。

中間件脫敏服務(wù)優(yōu)勢(shì)

  • 自動(dòng)化&透明化數(shù)據(jù)脫敏過(guò)程,用戶無(wú)需關(guān)注脫敏中間實(shí)現(xiàn)細(xì)節(jié)。
  • 提供多種內(nèi)置、第三方(AKS)的脫敏策略,用戶僅需簡(jiǎn)單配置即可使用。
  • 提供脫敏策略API接口,用戶可實(shí)現(xiàn)接口,從而使用自定義脫敏策略進(jìn)行數(shù)據(jù)脫敏。
  • 支持切換不同的脫敏策略。
  • 針對(duì)已上線業(yè)務(wù),可實(shí)現(xiàn)明文數(shù)據(jù)與密文數(shù)據(jù)同步存儲(chǔ),并通過(guò)配置決定使用明文列還是密文列進(jìn)行查詢。可實(shí)現(xiàn)在不改變業(yè)務(wù)查詢SQL前提下,已上線系統(tǒng)對(duì)加密前后數(shù)據(jù)進(jìn)行安全、透明化遷移。

適用場(chǎng)景說(shuō)明

  • 用戶項(xiàng)目使用Java語(yǔ)言進(jìn)行編程。
  • 后端數(shù)據(jù)庫(kù)為MySQL、Oracle、PostgreSQL、SQLServer。
  • 用戶需要對(duì)數(shù)據(jù)庫(kù)表中某個(gè)或多個(gè)列進(jìn)行脫敏(數(shù)據(jù)加密&解密)。
  • 兼容所有常用SQL。

限制條件

  • 用戶需要自行處理數(shù)據(jù)庫(kù)中原始的存量數(shù)據(jù)、洗數(shù)。
  • 使用脫敏功能+分庫(kù)分表功能,部分特殊SQL不支持,請(qǐng)參考SQL使用規(guī)范。
  • 脫敏字段無(wú)法支持比較操作,如:大于小于、ORDER BY、BETWEEN、LIKE等。
  • 脫敏字段無(wú)法支持計(jì)算操作,如:AVG、SUM以及計(jì)算表達(dá)式 。

加密策略解析

ShardingSphere提供了兩種加密策略用于數(shù)據(jù)脫敏,該兩種策略分別對(duì)應(yīng)ShardingSphere的兩種加解密的接口,即ShardingEncryptor和ShardingQueryAssistedEncryptor。

一方面,ShardingSphere為用戶提供了內(nèi)置的加解密實(shí)現(xiàn)類,用戶只需進(jìn)行配置即可使用;另一方面,為了滿足用戶不同場(chǎng)景的需求,我們還開放了相關(guān)加解密接口,用戶可依據(jù)該兩種類型的接口提供具體實(shí)現(xiàn)類。再進(jìn)行簡(jiǎn)單配置,即可讓ShardingSphere調(diào)用用戶自定義的加解密方案進(jìn)行數(shù)據(jù)脫敏。

SHARDINGENCRYPTOR

該解決方案通過(guò)提供encrypt(), decrypt()兩種方法對(duì)需要脫敏的數(shù)據(jù)進(jìn)行加解密。在用戶進(jìn)行INSERT, DELETE, UPDATE時(shí),ShardingSphere會(huì)按照用戶配置,對(duì)SQL進(jìn)行解析、改寫、路由,并會(huì)調(diào)用encrypt()將數(shù)據(jù)加密后存儲(chǔ)到數(shù)據(jù)庫(kù), 而在SELECT時(shí),則調(diào)用decrypt()方法將從數(shù)據(jù)庫(kù)中取出的脫敏數(shù)據(jù)進(jìn)行逆向解密,最終將原始數(shù)據(jù)返回給用戶。

當(dāng)前,ShardingSphere針對(duì)這種類型的脫敏解決方案提供了兩種具體實(shí)現(xiàn)類,分別是MD5(不可逆),AES(可逆),用戶只需配置即可使用這兩種內(nèi)置的方案。

SHARDINGQUERYASSISTEDENCRYPTOR

相比較于第一種脫敏方案,該方案更為安全和復(fù)雜。它的理念是:即使是相同的數(shù)據(jù),如兩個(gè)用戶的密碼相同,它們?cè)跀?shù)據(jù)庫(kù)里存儲(chǔ)的脫敏數(shù)據(jù)也應(yīng)當(dāng)是不一樣的。這種理念更有利于保護(hù)用戶信息,防止撞庫(kù)成功。

它提供三種函數(shù)進(jìn)行實(shí)現(xiàn),分別是encrypt(), decrypt(), queryAssistedEncrypt()。在encrypt()階段,用戶通過(guò)設(shè)置某個(gè)變動(dòng)種子,例如時(shí)間戳。針對(duì)原始數(shù)據(jù)+變動(dòng)種子組合的內(nèi)容進(jìn)行加密,就能保證即使原始數(shù)據(jù)相同,也因?yàn)橛凶儎?dòng)種子的存在,致使加密后的脫敏數(shù)據(jù)是不一樣的。在decrypt()可依據(jù)之前規(guī)定的加密算法,利用種子數(shù)據(jù)進(jìn)行解密。

雖然這種方式確實(shí)可以增加數(shù)據(jù)的保密性,但是另一個(gè)問(wèn)題卻隨之出現(xiàn):相同的數(shù)據(jù)在數(shù)據(jù)庫(kù)里存儲(chǔ)的內(nèi)容是不一樣的,那么當(dāng)用戶按照這個(gè)加密列進(jìn)行等值查詢(SELECT FROM table WHERE encryptedColumnn = ?)時(shí)會(huì)發(fā)現(xiàn)無(wú)法將所有相同的原始數(shù)據(jù)查詢出來(lái)。為此,我們提出了輔助查詢列的概念。該輔助查詢列通過(guò)queryAssistedEncrypt()生成,與decrypt()不同的是,該方法通過(guò)對(duì)原始數(shù)據(jù)進(jìn)行另一種方式的加密,但是針對(duì)原始數(shù)據(jù)相同的數(shù)據(jù),這種加密方式產(chǎn)生的加密數(shù)據(jù)是一致的。將queryAssistedEncrypt()后的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)中用于輔助查詢真實(shí)數(shù)據(jù)。因此,數(shù)據(jù)庫(kù)表中多出這一個(gè)輔助查詢列。

由于queryAssistedEncrypt()和encrypt()產(chǎn)生不同加密數(shù)據(jù)進(jìn)行存儲(chǔ),而decrypt()可逆,queryAssistedEncrypt()不可逆。 在查詢?cè)紨?shù)據(jù)的時(shí)候,我們會(huì)自動(dòng)對(duì)SQL進(jìn)行解析、改寫、路由,利用輔助查詢列進(jìn)行 WHERE條件的查詢,卻利用 decrypt()對(duì)encrypt()加密后的數(shù)據(jù)進(jìn)行解密,并將原始數(shù)據(jù)返回給用戶。這一切都是對(duì)用戶透明化的。

當(dāng)前,ShardingSphere針對(duì)這種類型的脫敏解決方案并沒(méi)有提供具體實(shí)現(xiàn)類,卻將該理念抽象成接口,提供給用戶自行實(shí)現(xiàn)。ShardingSphere將調(diào)用用戶提供的該方案的具體實(shí)現(xiàn)類進(jìn)行數(shù)據(jù)脫敏。

后續(xù)

本篇文章介紹了如何使用ShardingSphere產(chǎn)品之一的Encrypt-JDBC進(jìn)行接入,接入形式還可以選擇使用SpringBoot、SpringNameSpace等,這種形態(tài)的接入端主要面向JAVA同構(gòu),并與業(yè)務(wù)代碼共同部署在生產(chǎn)環(huán)境中。面向異構(gòu)語(yǔ)言,ShardingSphere還提供Encrypt-Proxy客戶端。Encrypt-Proxy是一款實(shí)現(xiàn)MySQL、PostgreSQL的二進(jìn)制協(xié)議的服務(wù)器端產(chǎn)品,用戶可獨(dú)立部署Encrypt-Proxy服務(wù),并且像使用普通MySQL、PostgreSQL數(shù)據(jù)庫(kù)一樣,使用例如Navicat第三方數(shù)據(jù)庫(kù)管理工具、JAVA連接池、命令行的方式訪問(wèn)這臺(tái)具有脫敏功能的虛擬數(shù)據(jù)庫(kù)服務(wù)器。

脫敏功能屬于Apache ShardingSphere分布式治理的功能范疇。事實(shí)上,Apache ShardingSphere這個(gè)生態(tài)還擁有其他更強(qiáng)大的能力,例如數(shù)據(jù)分片、讀寫分離、分布式事務(wù)、監(jiān)控治理等。您甚至可以選擇任意多種功能模塊進(jìn)行疊加使用,例如同時(shí)使用數(shù)據(jù)脫敏+數(shù)據(jù)分片,或是數(shù)據(jù)分片+讀寫分離,再或者是監(jiān)控治理+數(shù)據(jù)分片等。除了在功能層面的疊加選擇,ShardingSphere還提供了各種接入端形式,例如Sharding-JDBC或Sharding-Proxy等以滿足大家不同場(chǎng)景需求。

以上就是多數(shù)據(jù)源模式JPA整合sharding-jdbc實(shí)現(xiàn)數(shù)據(jù)脫敏的詳細(xì)內(nèi)容,更多關(guān)于多數(shù)據(jù)源模式JPA整合sharding-jdbc數(shù)據(jù)脫敏的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java使用websocket,并且獲取HttpSession 源碼分析(推薦)

    java使用websocket,并且獲取HttpSession 源碼分析(推薦)

    這篇文章主要介紹了java使用websocket,并且獲取HttpSession,通過(guò)使用配置源碼分析了各方面知識(shí)點(diǎn),具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • java結(jié)合keytool如何實(shí)現(xiàn)非對(duì)稱加密與解密詳解

    java結(jié)合keytool如何實(shí)現(xiàn)非對(duì)稱加密與解密詳解

    這篇文章主要給大家介紹了關(guān)于java結(jié)合keytool如何實(shí)現(xiàn)非對(duì)稱加密與解密的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(32)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(32)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • RabbitMQ使用案例詳解

    RabbitMQ使用案例詳解

    RabbitMQ是基于Erlang語(yǔ)言開發(fā)的開源的消息中間件,這篇文章給大家介紹RabbitMQ使用案例,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 淺談JAVA中輸入輸出流實(shí)例詳解

    淺談JAVA中輸入輸出流實(shí)例詳解

    Java中的流分為兩種,一種是字節(jié)流,另一種是字符流。這篇文章主要介紹了JAVA中輸入輸出流的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 解析Java多線程之常見鎖策略與CAS中的ABA問(wèn)題

    解析Java多線程之常見鎖策略與CAS中的ABA問(wèn)題

    本篇文章介紹了常見的鎖策略,并說(shuō)明了synchronized關(guān)鍵字加的鎖類型不是單一一種鎖類型的,根據(jù)可重入鎖與非可重入鎖引出了死鎖的概念與死鎖條件,最后介紹了CAS指令以及CAS鎖產(chǎn)生的ABA問(wèn)題及其解決方案,需要的朋友可以參考下
    2022-06-06
  • 詳解Java從工廠方法模式到 IOC/DI思想

    詳解Java從工廠方法模式到 IOC/DI思想

    工廠方法(Factory Method)模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口。本文將詳細(xì)介紹Java從工廠方法模式到 IOC/DI思想。
    2021-06-06
  • 創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析

    創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析

    這篇文章主要介紹了創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 將原生JDBC封裝實(shí)現(xiàn)CRUD的案例

    將原生JDBC封裝實(shí)現(xiàn)CRUD的案例

    這篇文章主要介紹了將原生JDBC封裝實(shí)現(xiàn)CRUD的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Java三種獲取redis的連接及redis_String類型演示(適合新手)

    Java三種獲取redis的連接及redis_String類型演示(適合新手)

    這篇文章主要介紹了Java三種獲取redis的連接及redis_String類型演示(適合新手),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論