在保留辨識共享子網的能力的同時,對 IP 地址進行假名化的最佳方法是什麼?
**背景:**我正在開發一個基於註冊使用者投票的應用程序,我想創建一個啟發式方法,其中涉及 IP 地址作為標記帳戶的一種方式,以便進一步調查潛在的多個帳戶+投票濫用。出於隱私/數據最小化/GDPR 義務的考慮,最好的策略似乎是儲存 IP 的鍵控雜湊,這對於檢查匹配來說足夠匿名但具有確定性。所以我可以在整個地址上使用 HMAC-SHA256 或類似的方法並完成它。
然而,在我看來,不僅辨識彼此相同的 IP,而且辨識共享子網的 IP,這可能會很有用,這需要一些不太透明的東西。顯而易見的方法是分別對 IP 的每個部分進行雜湊處理。問題在於,對於 HMAC-SHA256(例如),完整的輸出太大了,尤其是對於 IPv6 地址(每個 128 位地址 8 x 256 = 2048 位)。它還將大大減少輸入空間的大小(IPv4 為 1 字節值,IPv6 為 2 字節值) - 我認為如果我要這樣做,最好為每個部分使用不同的密鑰,這聽起來不好玩。
在保持儲存大小相對較小的同時實現我的目標的好方法是什麼?也許在使用 SHA256 時可以截斷輸出?也許因為它是一個 HMAC 並且密鑰是秘密的,所以可以像 MD5 一樣首先使用更小更弱的散列函式?也許還有另一個雜湊函式特別適合這種案例?任何指導表示讚賞。
經過更多搜尋(感謝評論中的指針),我遇到了Crypto-PAn 方案(通常拼寫為 CryptoPAn,沒有連字元),正是為了這個目的而描述/開發的。它有一些不同語言的軟體實現,其中一些支持 IPv6。
我正在尋找的屬性被稱為“prefix-preserving”,介紹 Crypto-PAn 的論文提供了一個數學證明,證明只有一種通用方法可以做到這一點(至少在某種程度上前綴的每個部分的值依賴於它之前的一切,而不是我提出的獨立方案)。
Crypto-PAn 涉及(重複)使用偽隨機函式 (PRF),在參考實現和大多數其他實現中是 AES-128-ECB。由於算法的工作原理,即使 PRF 使用了散列函式,假名 IP 地址也可以被破譯(當密鑰已知時)——換句話說,Crypto-PAn 是一種加密方案,與 PRF 無關。
Crypto-PAn 也恰好是格式保留的,因此這使得使用假名地址成為可能,就像使用原始地址一樣。
具有確定性和前綴保留以及在小值空間上操作的缺點是該方案必然對語義分析很弱。很明顯,為了獲得所需的效用,隱私權是不可避免的(我從一開始就知道)。換句話說,這是盡力而為,但這比儲存原始 IP 地址要好。當然,可以或應該採用其他技術來幫助降低風險(例如密鑰輪換、在設定的時間後刪除、使用不同的密鑰進行分區)。顯然,我希望我的其他安全實踐能夠從一開始就防止數據暴露。
從 2020 年開始有一個 IETF RFC,其中包括一個IP 地址匿名化/假名化技術表。除了 Crypto-PAn 之外,唯一同時屬於“假名化”和“前綴保留”類別的是一種稱為“Top-Hash Subtree-Replicated Anonymization (TSA)”的東西,它顯然針對速度進行了優化(可能不是一件好事在這種情況下?),但它附帶一個說明,表明它可能對 IPv6 地址太耗記憶體,而且我還沒有找到任何實現。