數據脫敏的處理方法及查詢

1)、數據脫敏是“指對某些敏感信息通過脫敏規則進行數據的變形,實現敏感隱私數據的可靠保護。在涉及客戶安全數據或者一些商業性敏感數據的情況下,在不違反系統規則條件下,對真實數據進行改造並提供測試使用,如×××號、手機號、卡號、客戶號等個人信息都需要進行數據脫敏。是數據庫安全技術之一。”

2)、本文介紹的脫敏數據報表查詢將利用潤乾集算器編寫 SPL 腳本,對敏感信息字段 (如: 姓名、證件號、銀行賬戶、住址、電話號碼、企業名稱、工商註冊號、納稅人識別號) 等通過預定義的脫敏規則進行數據脫敏、變形,實現敏感隱私數據的保護。

3)、潤乾集算器能使脫敏工作變得的簡單易行,同時可以減少大量重複性工作。通過集算器 SPL 腳本實現的脫敏數據,可直接作爲報表數據集進行查詢分析,也可以作爲開發、測試和其它非生產環境或外包環境下的真實數據集使用。

1.1  數據脫敏介紹

根據百度詞條的解釋,數據脫敏是“指對某些敏感信息通過脫敏規則進行數據的變形,實現敏感隱私數據的可靠保護。在涉及客戶安全數據或者一些商業性敏感數據的情況下,在不違反系統規則條件下,對真實數據進行改造並提供測試使用,如×××號、手機號、卡號、客戶號等個人信息都需要進行數據脫敏。是數據庫安全技術之一,數據庫安全技術主要包括:數據庫漏掃、數據庫加密數據庫防火牆數據脫敏數據庫安全審計系統。”

隨着信息時代的發展,我們對數據信息的安全要求越來越重視,比如對非生產環境下的敏感數據的脫敏保護。在金融、運營商、政府、能源等部門,非生產環境下數據脫敏已列入監管部門的法規要求。非生產環境數據多用於開發、測試、培訓以及第三方數據分析、挖掘,如果不能有效實施敏感數據保護,極易造成敏感數據的泄露。所以,保證非生產數據的安全已經成爲一個重要的課題,要求我們能夠通過對敏感信息進行脫敏、變形,實現有效的數據保護。

1.2  對數據脫敏工具的要求

數據脫敏工具應該具有對多種異構數據源的支持,從而將一個脫敏規則應用於不同的數據源,比如針對“客戶名稱”字段的修改,脫敏規則基本一致,所以應該可以在 Excel、TXT、Oracle、MS SQLServer、MySQL、Hadoop 等數據源上直接引用。另外,工具還應支持將脫敏數據完全不落地分發,提供文件到文件、文件到數據庫、數據庫到數據庫、數據庫到文件等方式,並且不需要在生產系統或本地安裝任何客戶端。

本文介紹的脫敏數據報表查詢將利用潤乾集算器編寫 SPL 腳本,對敏感信息字段 ( 如: 姓名、證件號、銀行賬戶、住址、電話號碼、企業名稱、工商註冊號、納稅人識別號) 等通過預定義的脫敏規則進行數據脫敏、變形,實現敏感隱私數據的保護。

潤乾集算器能使脫敏工作變得的簡單易行,同時可以減少大量重複性工作。通過集算器 SPL 腳本實現的脫敏數據,可直接作爲報表數據集進行查詢分析,也可以作爲開發、測試和其它非生產環境或外包環境下的真實數據集使用。

1.3  脫敏數據的特徵

數據脫敏不僅要執行數據漂白,抹去數據中的敏感內容,同時也需要保持原有的數據特徵、業務規則和數據關聯性,保證開發、測試、培訓以及大數據類業務不會受到脫敏的影響,達成脫敏前後的數據一致性和有效性:

保持原有數據特徵

數據脫敏前後必須保證數據特徵的保持,例如:×××號碼由十七位數字本體碼和一位校驗碼組成,分別爲區域地址碼(6 位)、出生日期(8 位)、順序碼(3 位)和校驗碼(1 位)。那麼×××號碼的脫敏規就需要保證脫敏後依舊保持這些特徵信息。

保持數據之間的一致性

在不同業務中,數據和數據之間具有一定的關聯性。例如:出生年月或年齡和出生日期之間的關係。同樣,×××信息脫敏後仍需要保證出生年月字段和×××中包含的出生日期之間的一致性。

保持業務規則的關聯性

保持數據業務規則的關聯性是指數據脫敏時數據關聯性以及業務語義等保持不變,其中數據關聯性包括:主、外鍵關聯性、關聯字段的業務語義關聯性等。特別是高度敏感的賬戶類主體數據往往會貫穿主體的所有關係和行爲信息,因此需要特別注意保證所有相關主體信息的一致性。

多次脫敏之間的數據一致性

相同的數據進行多次脫敏,或者在不同的測試系統進行脫敏,需要確保每次脫敏的數據始終保持一致性,只有這樣才能保障業務系統數據變更的持續一致性以及廣義業務的持續一致性。

1.4  數據脫敏應用場景

一般常見的數據脫敏場景,是將生產數據或是生產數據文件按照脫敏規則,將數據不落地脫敏至測試數據庫或是測試數據文件中,具體如下所示:

使用集算器的 SPL 可以按照業務場景要求自行定義和編寫脫敏規則,比如針對上面的人員信息:姓名、×××號、地址、電話號碼、卡號等進行不落地脫敏,滿足數據脫敏需要。

集算器是一個無框架,可快速部署開發的數據計算中間件工具,能夠直接運行編寫好的 SPL 數據脫敏腳本即時進行數據脫敏,支持各種常見的數據脫敏的處理方式,包括數據替換、無效化、隨機化、偏移和取整、掩碼屏蔽、靈活編碼等,本文介紹的數據脫敏方法都可以在實際應用中混合替換使用。

本文中應用場景的數據脫敏都是基於下表數據內容進行的,數據存儲在“數據脫敏驗證表.txt”文件中。

1.4.1 數據替換

數據脫敏要求:用設置的固定虛構值替換真值。例如將手機號碼統一替換爲 13800013800。

使用集算器 SPL 編碼實現的腳本,如下:


A

B

1

=file("數據脫敏驗證表.txt").import@t()

/導入文本數據

2

=A1.run(mobile=13800013800)

/電話號碼數據替換

A1:導入“數據脫敏驗證表”的文本數據。手機號碼脫敏前的顯示值如下:

A2:將手機號碼統一數據替換。直接使用run()函數對 mobile 手機號碼字段數據進行賦值替換爲13800013800。數據替換後,手機號碼脫敏後的顯示值如下:

1.4.2 無效化

數據脫敏要求:通過對數據值得截斷、加密、隱藏等方式使敏感數據脫敏,使其不再具有利用價值,例如將地址以 ****** 代替真值。數據無效化與數據替換所達成的效果基本類似。

使用集算器 SPL 編碼實現的腳本,如下:


A

B

1

=file("數據脫敏驗證表.txt").import@t()

/導入文本數據

2

=A1.run(address="******")

/地址隱藏式無效化

3

=A1.run(address=left(address,3)+"******")

/地址截斷無效化

A1:導入“數據脫敏驗證表”的文本數據。地址脫敏前顯示值如下:

A2:將地址進行數據隱藏式的無效化脫敏。直接使用run()函數對 address 地址字段數據進行無效化的 ****** 處理。數據無效化後,地址脫敏後的顯示值如下:

A3:將地址進行數據截斷式的無效化脫敏。使用left()函數對 address 地址源字符串的左邊三位字串加上 ****** 的截斷無效化處理。截斷無效化的地址脫敏後顯示值如下:

1.4.3 隨機化

數據脫敏要求:採用隨機數據代替真值,保持替換值的隨機性以模擬樣本的真實性。例如用隨機生成的姓和名代替真值。

使用集算器 SPL 編碼實現的腳本,如下:


A

B

C

1

=file("姓氏.txt").import@it()

=file("名字.txt").import@it()

/引入外部姓名字典表,用於隨機生成姓名信息

2

=file("數據脫敏驗證表.txt").import@t()

/導入文本數據

3

=A2.run(name=A1(rand(A1.len())+1)+B1(rand(B1.len())+1))

/姓名隨機化

A1:導入外部姓名字典表,用於隨機化替換姓名真值。此處需特別注意一下,由於“姓氏”和“名字”文本數據都是單列數據表,在使用import()函數時需要增加 @i 選項,@i 表示文本數據只有1列時返回成序列,在單元格 A3 中可以直接位置獲取隨機值。

A2:導入“數據脫敏驗證表”的文本數據。姓名脫敏前顯示值如下:

A3:將姓名進行隨機化脫敏。直接使用run()函數對 name 姓名進行隨機化,使用rand()函數從“姓氏.txt”和“名字.txt”外部字典表隨機化組合生成姓名。隨機化後姓名的顯示值如下:

【注意】這個例子中我們針對數據脫敏引入了外部字典表,實際情況中可以根據數據脫敏要求,隨時引入任意外部字典表,通過數據的隨機化組合,實現替換真值數據的脫敏處理。

1.4.4 偏移和取整

數據脫敏要求:通過隨機移位改變數字數據,例如日期 2018-01-02 8:12:25 變爲 2018-01-02 8:00:00,偏移取整在保持了數據的安全性的同時保證了範圍的大致真實性,此項功能在大數據利用環境中具有重大價值。

使用集算器 SPL 編碼實現的腳本,如下:


A

B


1

=file("數據脫敏驗證表.txt").import@t()

/導入文本數據

2

=A1.run(operatetime=string(operatetime,"yyyy-MM-dd   HH:00:00"))

/日期的偏移和取整

A1:導入“數據脫敏驗證表”的文本數據。操作日期脫敏前顯示值如下:

A2:將操作日期進行時間的偏移和取整脫敏。使用使用string()函數按照偏移和取整規則格式化成“yyyy-MM-dd HH:00:00”格式,操作時間脫敏後的顯示值如下:

【注意】脫敏後的日期時間保持了原有的數據特徵,方便脫敏數據的後續使用。

1.4.5 掩碼屏蔽

數據脫敏要求:掩碼屏蔽是針對賬戶類數據的部分信息進行脫敏時的有力工具,比如銀行卡號或是×××號的脫敏。

使用集算器 SPL 編碼實現的腳本,如下:


A

B


1

=file("數據脫敏驗證表.txt").import@t()

/導入文本數據

2

=A1.run(idnumber=left(string(idnumber),6)+"********"+

right(string(idnumber),4))

/×××號掩碼屏蔽

A1:導入“數據脫敏驗證表”的文本數據。×××號脫敏前顯示值如下:

A2:將×××號的出生日期進行掩碼屏蔽脫敏。使用left()函數截取×××號的左邊 6 位 + 字符串 ********+right()函數截取×××號右邊 4 位替換源×××字符串,×××號碼脫敏後的顯示值如下:

1.4.6 靈活編碼

數據脫敏要求:在需要特殊脫敏規則時,可執行靈活編碼以滿足各種可能的脫敏規則。比如用固定字母和固定位數的數字替代合同編號真值。

使用集算器 SPL 編碼實現的腳本,如下:


A

B


1

=file("數據脫敏驗證表.txt").import@t()

/導入文本數據

2

=A1.run(contractno="RAQA"+string(year(now()))+

mid(string(contractno),9,4)+string(#,"#000000000"))

/合同編號靈活編碼

A1:導入“數據脫敏驗證表”的文本數據。合同編號脫敏前顯示值如下:

A2:將合同編號進行自定義編碼脫敏。自定義編碼規則:4 位固定碼 + 當前年份 + 源目標字符串 4 位號碼 +9 位數值組成,使用的函數已有介紹,不再贅述,合同編號脫敏後顯示值如下:

1.4.7 脫敏數據的分發

集算器 SPL 支持文件到文件、文件到數據庫、數據庫到數據庫、數據庫到文件的脫敏數據分發。下面分別進行具體說明:

1.4.7.1    文本分發到文本

使用集算器 SPL 編碼實現的文本分發到文本的腳本如下:


A

B

C

1

=file("姓氏.txt").import@it()

=file("名字.txt").import@it()

/引入外部姓名字典表,用於隨機組合生成姓名信息

2

=file("數據脫敏驗證表.txt").cursor@t()

/導入大數據量文本數據


3

=A2.run(contractno="RAQA"+string(year(now()))+mid(string(contractno),9,4)+string(#,"#000000000"),name=A1(rand(A1.len())+1)  +B1(rand(B1.len())+1),address=left(address,3)+"******",mobile=13800013800,idnumber=left(string(idnumber),6)+"********"+right(string(idnumber),4),operatetime=string(operatetime,"yyyy-MM-dd   HH:00:00"))

/按照脫敏規則進行數據表脫敏

4

>file("脫敏數據結果表.txt").export@at(A3)

/直接導出到文本文件


A1-B1:引入外部字典表“姓氏”和“名字”的文本數據,用於隨機組合生成姓名信息。

A2:使用遊標導入大數據量的“數據脫敏驗證表”文本數據。

A3:按照脫敏規則進行數據表脫敏。

A4:直接將脫敏的數據導出到文本文件。使用export()函數導出脫敏數據,其中,其中 @t 指定將第一行記錄作爲字段名, 如果不使用 @t 選項就會以 _1,_2,…作爲字段名,@a表示追加寫, 不使用 @a 表示覆蓋,分發到文本的脫敏結果如下:

【注意】集算器 SPL 的文件處理能力還支持導入、導出 xls、xlsx、csv 等多種類型文件。

1.4.7.2    文本分發到數據庫

使用集算器 SPL 編碼實現的文本分發到數據庫(以 MySQL 爲例)的腳本如下:


A

B

C

1

=file("姓氏.txt").import@it()

=file("名字.txt").import@it()

/引入外部姓名字典表,用於隨機組合生成姓名信息

2

=file("數據脫敏驗證表.txt").cursor@t()

/導入大數據量文本數據

3

=A2.run(contractno="RAQA"+string(year(now()))+mid(string(contractno),9,4)+string(#,"#000000000"),name=A1(rand(A1.len())+1)  +B1(rand(B1.len())+1),address=left(address,3)+"******",mobile=13800013800,idnumber=left(string(idnumber),6)+"********"+right(string(idnumber),4),operatetime=string(operatetime,"yyyy-MM-dd   HH:00:00"))

/按照脫敏規則進行數據表脫敏

4

=connect("MySQL")

/連接 MySQL 數據源

5

>A4.update(A3,personinfo,code,contractno,name,address,

mobile,idnumber,operatetime;code)

/執行 update 更新,直接導出到數據庫中

6

>A4.close()

/關閉數據庫連接

A1-A3:同上。

A4:連接 MySQL 數據源。使用connect()進行 MySQL 數據庫的連接。如果用鼠標點擊 A4 單元格,可以直接查看 MySQL 數據庫的連接信息。具體查看數據庫配置教程相關章節文檔配置說明。

A5:更新 MySQL 數據庫中“personinfo”庫表的數據。使用update()將單元格 A3 的遊標數據更新到 MySQL 數據庫“personinfo”庫表中。使用數據庫工具查看結果如下

A6:使用close()函數關閉 A4 建立起的 MySQL 數據源連接。

1.4.7.3    數據庫分到數據庫

使用集算器 SPL 編碼實現的數據庫分發到數據庫的腳本如下(均以 MySQL 爲例):


A

B


1

同上

/引入外部姓名字典表,用於隨機組合生成姓名信息

2

=connect("MySQL")

/連接 MySQL 數據源

3

=A2.cursor("select *   from personinfo_copy")

/遊標讀取 MySQL 中 personinfo_copy 表待脫敏數據

4

同上 A3 單元格

/按照脫敏規則進行數據表脫敏

5

>A2.update(A4,personinfo_copy_test,code,contractno,

name,address,mobile,idnumber,operatetime;code)  

/執行 update 更新,直接將脫敏數據導出到數據庫的 personinfo_copy_test 表中

6

>A2.close()

/關閉數據庫連接

A1:同上。

A2:連接 MySQL 數據源。

A3:遊標讀取 MySQL 中表“personinfo_copy”的待脫敏數據。該表的數據如下:

A4:同上。

A5:更新 MySQL 數據庫中“personinfo_copy_test”庫表的數據。使用update()將單元格 A3 的遊標數據更新到 MySQL 數據庫的“personinfo_copy_test”庫表中。結果如下:

A6:使用close()函數關閉 A2 建立起的 MySQL 數據源連接。

1.4.7.4    數據庫分到文本

使用集算器 SPL 編碼實現的數據庫(以 MySQL 爲例)分發到文本的腳本如下:


A

B


1

同上

/引入外部姓名字典表,用於隨機組合生成姓名信息

2

同上

/連接 MySQL 數據源

3

同上

/遊標讀取 MySQL 中 personinfo_copy 表待脫敏數據

4

同上 A4 單元格

/按照脫敏規則進行數據表脫敏

5

>file("脫敏數據結果表.txt").export@at(A4)

/直接導出到文本文件

6

>A2.close()

/關閉數據庫連接

A1-A4:同上。

A5:直接將脫敏的數據庫(MySQL)數據分發到文本文件。分發到文本的脫敏結果同上。

A6:使用close()函數關閉 A2 建立起的 MySQL 數據源連接。

1.5  脫敏數據報表查詢實例

下面我們就結合上面介紹的數據脫敏方法,具體實現一個可以動態配置是否脫敏數據的報表查詢實例,大致流程如下:

1.5.1 集算器數據脫敏 SPL 腳本準備

   利用上面已有的"數據脫敏驗證表.txt" 文本數據,實現脫敏數據報表查詢,具體腳本如下:


A

B

C

D

1

=file("姓氏.txt").import@it()

=file("名字.txt").import@it()

/引入外部姓名字典表,用於隨機組合生成姓名信息

2

func

/調用配置文件中的數據脫敏規則進行數據脫敏


3


=file("數據脫敏規則配置.ini").property(A2(2))

4


if   type=="type2"

=eval(B3,"A1","A1","B1","B1")

/特殊規則的動態解析替換 "?" 值

5



=eval(B3,A2(1))

/通用規則的動態解析替換 "?" 值

6


return ${B3}



7

=file("數據脫敏驗證表.txt").cursor@t()



8

if type!=0

=



9


=A7.run(contractno=func(A2,[contractno,"type1"]),name=func(A2,[name,"type2"]),address=func(A2,[address,"type3"]),

mobile=func(A2,[mobile,"type4"]),idnumber=func(A2,[idnumber,"type5"]),operatetime=func(A2,[operatetime,"type6"]))

/按照脫敏規則進行數據表脫敏

10

return if(type!=0,B9,A7)

/說明:參數 type 控制是否對數據進行脫敏 (0: 不脫敏)

A1-B1:引入外部字典表“姓氏”和“名字”的文本數據,用於隨機組合生成姓名信息。

A2:定義一個子程序。使用func函數定義一個通用的數據脫敏規則處理子程序,該子程序主要是調用配置文件中的數據脫敏規則進行數據脫敏。不同數據字段可以根據自身特點和業務要求進行規則複用。關於子程序的內容可以參考:集算器 -> 教程 -> 高級代碼 ->子程序文檔說明。

B3:讀取數據脫敏規則配置文件信息。使用property()函數從“數據脫敏規則配置.ini”屬性文件中讀取 type 屬性值。

B4-B5:使用動態解析並計算規則配置文件中的規則,實現對應字段的數據脫敏處理。其中,子程序中使用eval()函數動態解析並計算表達式,實現動態解析並替換脫敏規則配置文件(*.ini)中的 "?" 值,增加一個 type 值判斷,將一般 type 中的 "?" 替換爲調用 func 子程序主格的位置值,對引入外部數據字典表的 tpye2 規則,單獨判斷替換 "?" 值爲外部字典所在單元格值,最終計算替換的表達式並執行對應字段的數據脫敏。

B6:使用宏動態計算表達式並返回運算結果,使用return函數將從屬性配置文件中讀取的 type 屬性值通過“${}”宏替換並返回運算結果給被 B9 單元格調用的程序中。

A7:遊標獲取未脫敏的源端生產數據。

A8:通過傳遞的網格參數 type(type=0:不脫敏)值判斷是否對數據脫敏,如果脫敏,則執行 B9 單元格的源端生產數據的脫敏處理。

B9:按照脫敏規則進行數據表脫敏,直接調用 A2 主格子程序 func 進行數據脫敏。

A10:根據 type 值返回對應的脫敏或未脫敏數據。

接下來,需要在集算器設計器的功能菜單“程序 -> 網格參數”中設置一個參數“type”,用於接收報表參數傳遞進行是否脫敏的數據權限控制。

至此,集算器的 SPL 腳本編寫和設置完成,下一步進行“數據脫敏規則配置.ini”文件的新建設置。

1.5.2 數據脫敏規則配置文件

文件“數據脫敏規則配置.ini”爲集算器 SPL 腳本提供了對數據字段的脫敏規則配置,從而實現脫敏規則與腳本分離的設計,可以在不修改腳本的情況下自定義脫敏規則。當然,這個配置文件也可以數存儲在數據庫中,提供全局的脫敏規則配置管理。該配置文件的內容如下:

配置文件說明:#自定義配置脫敏規則,使用 eval() 函數實現動態解析替換解析 "?",通常 type 中的 "?" 是指固定調用 func 子程序的主格,這裏 tpye2 規則特殊,需要單獨判斷替換 "?"。

【注意】這裏僅是提供一種脫敏規則的配置思路,目的是可以最大限度的複用和靈活調用,相似的數據字段就不需要重複定義和編寫脫敏規則了。實際應用中,程序員們可以根據需求自定義配置。

1.5.3 報表模板準備

使用最新版本的潤乾報表 V2018 版本開發一張報表模板,並設置報表是否脫敏參數“type”(與集算器 SPL 腳本中的網格參數對應使用)。

設置集算器 SPL 腳本爲報表的數據集“ds1”,選中對應的 dfx 腳本,並配置 type 參數表達式,具體如下:

開發的報表模板“報表數據脫敏.rpx”如下:

【注意】這裏面調用的集算器數據集返回的是遊標,需要在報表屬性 -> 常規 設置集算器數據集爲大數據集,並且該功能需要報表產品包含集算器授權。

1.5.4 脫敏數據報表發佈

直接在報表設計器中啓動 web 服務,使用瀏覽器瀏覽報表,當設置參數 type 值爲“0”不脫敏時,報表展示數據如下:

當參數 type 設置非“0”值時,報表展示數據如下:

1.5.5 脫敏數據報表查詢總結

這個脫敏數據報表查詢實例有以下四個特點:

1)直接對源數據脫敏後在報表 WEB 端進行數據查詢和展示。

沒有按常規數據脫敏的方式,先將脫敏數據進行分發入庫或入文件,而是直接將數據使用集算器 SPL 腳本進行脫敏,配合報表的大數據集異步數據加載實現了大數據的即時脫敏數據查詢展示。免去源數據脫敏 -> 目標入庫 -> 數據展示的目標入庫步驟。

2)免去新建數據脫敏庫步驟,減少脫敏工作量。

爲了應對一些老項目或特殊情況,比如脫敏的數據表都是明文顯示,但是不能分發或新建脫敏後的數據庫表,通過對明文數據直接抽取加密,免去新建脫密庫步驟,減少整體脫敏工作量。

3)自定義配置數據脫敏規則。

可以靈活配置規則文件,滿足不同的規則配置需求。

4)動態控制數據是否開啓脫敏權限。

可以根據平臺用戶查看數據的權限,動態的傳遞參數值控制是否對數據進行脫敏顯示,一方面防止數據的泄密,從底層保證數據安全,另一方面也爲高權限客戶提供查看敏感數據的途徑。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章