前言
近年來,隨著數據挖掘,機器學習等技術的發展與深入,企業從普通用戶處收集到的大量的數據就變得越來越有價值,對這些數據進行分析處理可以更好的了解用戶的習慣和喜好,從而向用戶提供更加個性化的服務,最終使得用戶對商業以及研究的價值最大化。但是在使用包含有大量個人敏感信息的數據的過程中,不管是直接發布或者內部分析都可能使得不法分子收集到用戶的隱私,損害用戶的相關權益,因此有必要對輸出的數據進行匿名化處理。
在個保法和GDPR/CCPA中,對匿名化(anonymization)的定義是相似的。 匿名化是指個人信息經過處理后,無論是否借助其他信息或工具都無法識別特定自然人且不能復原的過程。
一、匿名化常用技術手段
1、屬性抑制
- · 屬性抑制是指刪除數據集中某個屬性的全部數據(刪除某個列),該技術一般應用在匿名化過程開始時。
- · 某些情況下,可以使用派生屬性來提高數據集的可用性,例如抑制“工作開始時間”和“工作結束時間”,但是可以創建“工作年限”屬性
處理前
姓名 |
公司 |
工作開始時間 |
工作結束時間 |
張三 |
abc |
2015.9 |
2018.3 |
李四 |
tbc |
2016.9 |
2022.4 |
王五 |
bcd |
2013.9 |
2021.10 |
孫六 |
jbc |
2011.9 |
2023.10 |
處理后,“姓名”抑制,派生“工作年限”
公司 |
工作年限(年) |
abc |
3 |
tbc |
6 |
bcd |
8 |
jbc |
12 |
data = DataAnonymizationUtil.dropColumns(String... columns,data);data = DataAnonymizationUtil.createColumns(String... columns,data);
2、記錄抑制
- · 記錄抑制是指刪除數據集中的整條記錄,刪除唯一或不滿足標準(例如k?匿名)的異常記錄。
- · 刪除記錄可能會影響數據集,比如可能會影響統計數據種的平均數,中位數等。
處理前:
姓名 |
公司 |
工作開始時間 |
工作結束時間 |
張三 |
abc |
2015.9 |
2018.3 |
李四 |
abc |
2016.9 |
2019.4 |
王五 |
abc |
2017.9 |
2020.10 |
孫六 |
abc |
2011.9 |
2023.10 |
姓名屬性抑制,以及時間派生屬性后
公司 |
工作年限(年) |
abc |
3 |
abc |
3 |
abc |
3 |
abc |
12 |
從上面可以看出,孫六的12年和其他人員的工作年限比起來會特別的大,如果其他的一些信息,可能會猜出第四行為孫六,因此應該將第四行刪除
第四行記錄抑制(刪除)后
公司 |
工作年限(年) |
abc |
3 |
abc |
3 |
abc |
3 |
data = DataAnonymizationUtil.deleteRows(int[] rowNumber,data);
3、數據脫敏(字符屏蔽)
- · 數據脫敏是數據字符的更改,例如通過符號*或x等對源數據進行替換修改,一般為部分脫敏,即應用與屬性中的一些字符,主要應用于當隱藏屬性的部分就滿足所需的匿名程度時。
- · 脫敏需要考慮屏蔽掉的字符是否反應原數據的相關信息。提前知道數據內本身的規則屏蔽尤其重要,以確保屏蔽到正確的字符。比如數據中的校驗位(比如身份證的校驗位),如果脫敏不徹底,校驗位可能用于恢復脫敏數據。
處理前
工號 |
層級 |
工作年限 |
1234 |
6 |
1 |
1324 |
7 |
2 |
1423 |
8 |
3 |
脫敏后
工號 |
層級 |
工作年限 |
1*** |
6 |
1 |
1*** |
7 |
2 |
1*** |
8 |
3 |
data = DataAnonymizationUtil.maskColumn(String... columns,data);
4、假名化
- · 用虛構的值替換識別數據。假名化也稱為編碼。假名可以是不可逆的,也可以是可逆(由原始數據的所有者),匿名化要求,需要采用不可逆假名。
- · 持久化假名允許通過使用相同的化名來表示不同數據集中的同一個屬性以進行關聯。在某些情況下也需要使用不同的假名來表示不同數據集中的同一個人,以防止數據被關聯。
處理前
姓名 |
績效評分 |
工作年限 |
張三 |
60 |
1 |
李四 |
70 |
2 |
王五 |
80 |
3 |
處理后
姓名 |
績效評分 |
工作年限 |
abc |
60 |
1 |
123 |
70 |
2 |
xyz |
80 |
3 |
data = DataAnonymizationUtil.pseudColumn(String... columns,data);
5、泛化(一般化)
- · 泛化降低了數據的精度。例如,將人的年齡轉換為年齡范圍,或將精確位置轉換為不太精確的位置。對于可以泛化并且對結果預期有用的屬性,可以設計適當的規則進行泛化處理。
- · 設計具有適當大小的數據范圍。數據范圍太大可能意味著數據可能被修改得太多,數據的價值會降低;而數據范圍太小可能意味著數據幾乎沒有被修改,容易被重新識別,不滿足要求。請注意,第一個和最后一個范圍可以是更大的范圍,以容納這些末端通常較少的記錄;
處理前
姓名 |
年齡 |
薪資 |
張三 |
25 |
25734 |
李四 |
35 |
43527 |
王五 |
30 |
37524 |
孫六 |
28 |
34257 |
處理后
姓名 |
年齡 |
薪資 |
張* |
20-30 |
20000-30000 |
李* |
30-40 |
40000-50000 |
王* |
30-40 |
30000-40000 |
孫* |
20-30 |
30000-40000 |
data = DataAnonymizationUtil.generalizeColumn(String... columns,data);
6、數據交換
- · 交換的目的是重新排列數據集中的數據,使得各個屬性值仍然在數據集中表示,但通常與原始記錄不對應。
- · 適用于分析只看聚合數據的情況,或者分析是在屬性內分析時;換句話說,不需要分析記錄級別的屬性之間的關系。
處理前
姓名 |
年齡 |
薪資 |
張三 |
25 |
25734 |
李四 |
35 |
43527 |
王五 |
30 |
37524 |
孫六 |
28 |
34257 |
處理后
姓名 |
年齡 |
薪資 |
張* |
28 |
25734 |
李* |
30 |
37524 |
王* |
35 |
43527 |
孫* |
25 |
34257 |
data = DataAnonymizationUtil.swapRows(int[] rows,data);
7、數據擾動
- · 原始數據集中的值被修改為略有不同即為數據擾動,對于準標識符(通常是數字和日期),與其他數據源結合時可能會被識別,并且值的輕微變化是可以接受的。該技術不應在數據準確性要求較高的情況下使用
- · 擾動程度應與屬性值的范圍成比例,比例太小,不滿足匿名化要求;比例太大,最終值將與原始值相差太大,擾動后數據集的可用性可能會嚴重降低。
處理前
姓名 |
年齡 |
薪資 |
張三 |
25 |
25734 |
李四 |
35 |
43527 |
王五 |
30 |
37524 |
孫六 |
28 |
34257 |
處理后
姓名 |
年齡 |
薪資 |
張* |
27 |
24257 |
李* |
33 |
43527 |
王* |
28 |
37524 |
孫* |
30 |
35734 |
data = DataAnonymizationUtil.perturbeColumn(String... columns,data);
8、數據合成
- · 它直接與原始數據分開,重新生成符合模式的數據集,而不是修改原始數據集,通常是當系統測試需要大量數據,但不能提供真實數據且要求提供的數據在某些方面應該是符合模式的,如格式、屬性之 間的關系等。
- · 數據在合成時需要研究原始數據集中的模式,并在創建“匿名”數據集(即合成數據)時應用這些模式。根據測試范圍和要求,可以生成全部或部分合成數據;例如,在進行測試時,需要引用其他數據集,那么正在測試的少數數據需要保持其原始形式,但其他信息可以是合成的。
- · 應用此技術時,可能需要額外注意異常值。出于測試目的,異常值通常非常有價值,因此在合成數據時需要特別注意異常值的合成。
處理前
姓名 |
年齡 |
薪資 |
張三 |
25 |
25734 |
李四 |
35 |
43527 |
王五 |
30 |
37524 |
孫六 |
28 |
34257 |
處理后
姓名 |
年齡 |
薪資 |
a* |
27 |
34257 |
c* |
33 |
33527 |
d* |
28 |
27524 |
b* |
30 |
45734 |
data = DataAnonymizationUtil.synthesis(data);
9、數據聚合
- · 將數據集從記錄列表轉換為匯總值即為數據聚合,主要應用于不需要單獨記錄,而僅僅需要聚合數據的場景。
- · 請注意執行聚合后記錄太少的組。在某些情況下聚合數據的單個記錄,加入額外知識可能會輕松推斷原數據。
處理前
姓名 |
年齡 |
薪資 |
張三 |
25 |
25734 |
李四 |
35 |
43527 |
王五 |
30 |
37524 |
孫六 |
28 |
34257 |
處理后
年齡段 |
平均薪資 |
20-30 |
30000 |
30-40 |
40000 |
data = DataAnonymizationUtil.aggregate(data);
二、匿名化步驟
匿名化技術在提升數據隱私保護力度的同時,會犧牲數據的可用性,所以在設計和執行匿名化方案時可以遵循如下步驟
1、理解數據
研究原始數據,區分其中不同類型的數據字段(直接標識符,準標識符,普通字段屬性),方便后續使用不同的處理方式,作為數據最小化的一部分,應首先刪除結果數據集中不需要的任何數據屬性。
數據匿名化技術介紹
2、應用匿名化技術
篩選出需要匿名化的字段,結合數據使用場景和需求,組合使用不同的匿名化技術。
數據匿名化技術介紹
3、評估重標識風險
對匿名化結果進行重標識風險分析,如果評估得出重標識風險超過預期,需要回步驟二深度應用或者重新選擇匿名化方案。重標識(re-identification)指的是對匿名化的數據重新關聯到原始個人信息主體的一種數據處理方式,它是匿名化的一個逆向操作。以下為常見的重標識風險
1)識別符泄露
指的是處理過程中對識別符字段的匿名化程度不夠,導致對手可以直接獲取到信息主體的直接/間接識別符。例如:手機號碼直接計算哈希值,對手通過哈希碰撞方式,可以獲得數據集中的全部或部分明文手機號碼。
2)屬性泄露
對手雖然無法從發布的數據集中獲得信息主體的識別信息,但可以確定該主體某個屬性的屬性值
住址 |
性別 |
年齡 |
是否有糖尿病 |
荷花小區 |
男 |
20-30歲 |
無 |
荷花小區 |
女 |
20-30歲 |
有 |
荷花小區 |
男 |
90-100歲 |
無 |
如上例,可以知曉荷花小區有一位年齡大于90歲的老人,并且能確定該老人有糖尿病。該數據集雖然沒暴露個人識別信息(不知道該老人是誰),但還是暴露了該自然人病史信息。
3)推理信息泄露
通過數據集中反映的規律來推斷用戶的某項屬性,比如脫敏后數據集顯示荷花小區50-60歲有30人,其中20人近視為100度到500度,10人近視為500度到1000度,則如果知道自然人是居住在荷花小區后,且年齡是50-60歲之間,就可以知道此人肯定是近視患者。
4、管理匿名數據發布風險
基于風險評估結果,結合其他技術措施和管理措施來應對已識別風險。
1)可用技術措施
- · 對發布數據集進行嚴格的權限訪問控制,限制可訪問數據集用戶的范圍,并定期對訪問權限進行檢查;
- · 對包含高度敏感信息的數據集,匿名化處理后再次進行加密;
2)可用管理措施
- · 記錄已共享數據集,防止不同數據集通過組合暴露個人隱私;
- · 通過審批流程控制匿名化后的數據集訪問的使用;
- · 禁止組織內部成員對匿名化數據集未經批準進行重識別;
- · 定期檢查數據的重標識風險;
- · 定期清理組織內部不再使用的匿名數據集;
四、K匿名化技術
1、K-匿名
K-匿名模型(k-anonymity)是一種用于評估匿名化/去特征化后數據的信息安全的模型。它要求處理后的數據集中每個準識別符至少有K條相同的記錄,增加從數據集中直接篩選出記錄并進行關聯攻擊的難度。
K-匿名的概念是由Latanya Sweeney和 Pierangela Samarati在1998年的一篇論文中最先提出的,其目的是為了解決如下問題:“給定一組結構化的具體到個人的數據,能否得出一組經過處理的數據,使我們可以證明數據中涉及的個人不能被再識別,同時還要保證數據仍具有使用價值。”使一組數據滿足k-anonymity的過程稱為K-匿名。
比如下面這個例子中,每個準識別符住址,性別,年齡至少有2個相同的記錄。
處理前
住址 |
性別 |
年齡 |
身高是否大于180cm |
荷花小區棟889室 |
男 |
25 |
是 |
荷花小區2棟889室 |
女 |
28 |
否 |
美麗小區30棟3室 |
男 |
34 |
是 |
美麗小區30棟3001室 |
男 |
45 |
是 |
美麗小區30棟1212室 |
女 |
32 |
否 |
荷花小區2棟601室 |
男 |
43 |
是 |
美麗小區31棟1210室 |
女 |
48 |
否 |
荷花小區12棟601室 |
女 |
41 |
是 |
處理后
住址 |
性別 |
年齡 |
身高是否大于180cm |
荷花小區*棟*室 |
男 |
20-30 |
是 |
荷花小區*棟*室 |
女 |
20-30 |
否 |
美麗小區*棟*室 |
男 |
30-40 |
是 |
美麗小區*棟*室 |
男 |
40-50 |
是 |
美麗小區*棟*室 |
女 |
30-40 |
否 |
荷花小區*棟*室 |
男 |
40-50 |
是 |
美麗小區*棟*室 |
女 |
30-40 |
否 |
荷花小區*棟*室 |
女 |
40-50 |
是 |
K-匿名方法主要有兩種:
1)數據抑制,主要是講一些屬性的值用*取代或者刪除對應的屬性;
2)數據泛化,將一些屬性的精確值用更寬泛的值替代,比如說把年齡這個數字概括成一個年齡段。
判斷是否K匿名的偽代碼
public static boolean isKAnonymized(List data, int k) {
Map dataMap = new HashMap<>();
for (Object o : data) {
ArrayList ar = (ArrayList) o;
String sb = IntStream.range(0, ar.size()).mapToObj(i -> String.valueOf(ar.get(i)))
.collect(Collectors.joining());
dataMap.merge(sb, 1, Integer::sum);
}
return dataMap.keySet().stream().noneMatch(key -> dataMap.get(key) < k);
}
如果不滿足,可以通過泛化來對數據進行修改,示例代碼為對里面int類型的數字進行泛化
public static List generalize(List data) {
List data2 = new ArrayList<>();
for (Object o : data) {
ArrayList ar = (ArrayList) o;
ArrayList ar2 = new ArrayList<>();
for (int i = 0; i < ar.size(); i++) {
Object o1 = ar.get(i);
if (o1 instanceof Integer) {
ar2.add((int) o1 / 10);
} else {
ar2.add(o1);
}
}
data2.add(ar2);
}
return data2;
}
K-匿名能保證以下三點:
- · 攻擊者無法知道某個人是否在公開的數據中
- · 給定一個人,攻擊者無法確認他是否有某項敏感屬性
- · 攻擊者無法確認某條數據對應的是哪個人
盡管K-匿名化是一個可以較好解決數據匿名化問題的手段,但是如果處理不當,仍然可以從其他角度攻擊匿名化后的數據,這些攻擊包括:
攻擊方法1:未排序匹配攻擊
當公開的數據記錄和原始記錄的順序一樣時,攻擊者可以猜出匿名化的記錄屬于誰。
例如:如果攻擊者知道在數據集中李四為最后一項或張三為第一項,那么就可以確認,李四購買偏好是健身相關,而張三購買偏好為游戲相關。
性別 |
年齡 |
購買偏好 |
男 |
20-30 |
游戲相關 |
男 |
20-30 |
健身相關 |
攻擊方法2:同質化攻擊
某個K-匿名組內對應的敏感屬性的值也完全相同,這使得攻擊者可以輕易獲取想要的信息。
例如:已知張三為男性,年齡為23歲,那么可以確認,張三購買偏好是健身相關,李四為女性,李四年齡為35歲,則可以確認李四的購買偏好為穿戴相關。
性別 |
年齡 |
購買偏好 |
男 |
20-30 |
健身相關 |
男 |
20-30 |
健身相關 |
女 |
30-40 |
穿戴相關 |
女 |
30-40 |
穿戴相關 |
攻擊方法3:背景知識攻擊
即使K-匿名組內的敏感屬性并不相同,攻擊者也有可能依據其已有的背景知識以高概率獲取到其隱私信息。
例如:攻擊者知道王六為女生,且知道她及其厭惡烹飪,那么從表中,攻擊者可以確認王六的購買偏好是穿戴。相關
性別 |
年齡 |
購買偏好 |
男 |
20-30 |
游戲相關 |
男 |
20-30 |
健身相關 |
女 |
30-40 |
烹飪相關 |
女 |
30-40 |
穿戴相關 |
攻擊方法4:補充數據攻擊
假如一份數據被公開多次,且它們的k-匿名方式并不一樣,那么攻擊者可以通過關聯多種數據推測用戶信息。
例如:從一個表中對其進行不同列的2-匿名計算,得到兩個不同的表,如果攻擊者將兩個表格的數據進行拼接,形成一個新的表,可能就會發現新表中存在的唯一數據。
2、L-多樣性
L多樣性(l−diversity)為克服k匿名模型缺陷,machanavajjhala等人提出的一種增強k匿名模型。即在公開的數據中,對于那些準標識符相同的數據,敏感數據必須具有多樣性,這樣才能保證用戶的隱私不能通過背景知識等方法推測出來。
L-多樣性是指相同類型數據中至少有L種內容不同的敏感屬性,使得攻擊者最多以 1/L的概率確認個體的敏感信息
住址 |
性別 |
年齡 |
購買偏好 |
美麗小區*棟*室 |
男 |
20-30 |
游戲相關 |
美麗小區*棟*室 |
男 |
20-30 |
健身相關 |
美麗小區*棟*室 |
男 |
20-30 |
烹飪相關 |
美麗小區*棟*室 |
男 |
20-30 |
穿戴相關 |
美麗小區*棟*室 |
男 |
20-30 |
游戲相關 |
美麗小區*棟*室 |
男 |
20-30 |
健身相關 |
美麗小區*棟*室 |
男 |
20-30 |
烹飪相關 |
美麗小區*棟*室 |
男 |
20-30 |
穿戴相關 |
在這個例子中,有8條相同的類型的數據,其中購買偏好有4種類型,那么在這個例子中,匿名化后的數據就滿足4-多樣性。
數據匿名化技術介紹
3、T-相近性
T-相近性(t-closeness)是對L多樣性匿名化的進一步細化處理,在對屬性值進行處理時還需要增加考慮屬性數據值的統計分布,T-相近性要求每個K匿名組中敏感屬性值的統計分布情況與整個數據的敏感信息分布情況接近,不超過閾值T;
序號 |
住址 |
性別 |
年齡 |
購買偏好 |
1 |
美麗小區*棟*室 |
男 |
20-30 |
穿戴相關 |
2 |
美麗小區*棟*室 |
男 |
20-30 |
穿戴相關 |
3 |
美麗小區*棟*室 |
男 |
20-30 |
穿戴相關 |
4 |
美麗小區*棟*室 |
男 |
20-30 |
游戲相關 |
5 |
美麗小區*棟*室 |
男 |
30-40 |
游戲相關 |
6 |
美麗小區*棟*室 |
男 |
30-40 |
游戲相關 |
7 |
美麗小區*棟*室 |
男 |
30-40 |
游戲相關 |
8 |
美麗小區*棟*室 |
男 |
30-40 |
穿戴相關 |
從例子中可以看出 購買偏好(穿戴相關,游戲相關)在整個數據集中的概率分布為50%,但是在單個等價類中概率為25%和75%,不滿足T-相近性,需要繼續進行數據調整
序號 |
住址 |
性別 |
年齡 |
購買偏好 |
1 |
美麗小區*棟*室 |
男 |
20-30 |
穿戴相關 |
4 |
美麗小區*棟*室 |
男 |
20-30 |
游戲相關 |
5 |
美麗小區*棟*室 |
男 |
30-40 |
游戲相關 |
8 |
美麗小區*棟*室 |
男 |
30-40 |
穿戴相關 |
這樣可以保證在整個數據集中和每個等價類中的購買偏好的概率相同,用數學來進行表達,如下
數據匿名化技術介紹
假設在看到發布的數據集之前,觀察者對個性敏感屬性的先驗看法(prior belief)為B0 B0,給觀察者一個抹去準標識符的數據表,表中敏感屬性的分布為 Q Q,根據 Q ,觀察者的后驗看法(posterior belief) 變為B1 。B1
根據敏感屬性在整個數據集中的概率分布 調整在等價類中的敏感屬性記錄,得到概率分布為 P P ,根據 PP ,觀察者得到的后驗看法變為 B2 。B2
L-多樣性的目標是減小 B0 B0和 B2 之間的差異,而T-相近性的目標是減小 B1B1 和 B2B2 之間的差異。
也就是說敏感屬性分布 QQ 在數據集中的分布是公共信息。我們不限制觀察者獲得的關于數據集的信息,但限制觀察者能夠了解關于特定個體的額外信息的程度。
理論上只要發布一個匿名化版本的數據,就會發布一個概率分布 QQ 。 發布的數據價值可以用 B0B0 與 B1B1 B1 之間的差別表示。二者差別越大,表明數據的價值越大。而 B1B1 B1 和B2 B2 之間的差別,就是我們需要保護的隱私信息,應該被盡可能限制。
直覺上來說,如果 P = Q P=Q ,那么 B1 B1B1 和 B2B2 B2 應該是相同的。如果 PP 和 QQ 很接近,那么 B1 B1B1 和 B2B2 B2 也應該很接近。若一個等價類的敏感屬性取值分布與整張表中該敏感屬性的取值分布的距離不超過閾值T,則稱該等價類具有T-相近性。若一個表中所有等價類都有T-相近性,則該表也有T-相近性。
五、文章總結
本文介紹了常規化的匿名化技術手段,同時對匿名化步驟進行了說明,詳細解釋了可能會發生的重標識風險,最后介紹了K匿名化技術,以及為了防止K匿名化被攻擊和數據可用性問題,衍生出來的L多樣性和T相近性等技術
K匿名化是基于數據處理的匿名化算法,下篇我們會介紹基于算法的匿名化算法,差分隱私算法。
六、參考文獻
- · Li, N.; Li, T.; Venkatasubramanian, S. t-closeness: Privacy beyond k-anonymity and l-diversity. In Proceedings of the IEEE International Conference on Data Engineering, Istanbul, Turkey, 15–20 April 2007;
- · An Introduction to Privacy for Technology Professionals-CIPT官方教程