破解雜湊電話號碼容易嗎?
我想對電話號碼進行 SHA256 雜湊處理以隱藏它們。這是一個好主意嗎?還有其他方法可以使這個安全嗎?
不,對電話號碼進行雜湊處理不是一個好主意。電話號碼數量有限,因此對手很容易嘗試對所有電話號碼進行雜湊處理。然後您可以簡單地將每個雜湊值與儲存的雜湊值進行比較。通常,您不必處理所有電話號碼,只需處理電話號碼的一小部分(對於特定國家或邏輯上不同的其他組)。
您可以使用帶有鹽和工作因子的慢速密碼雜湊,但這僅意味著所需的時間乘以一個大的恆定值。它不會改變操作的順序。如果子集足夠小,它可能不會阻止對手執行所有必要的計算。
在這種情況下,您可能需要加密電話號碼。或者使用鍵控散列,例如 HMAC。不過,對於這兩個選項,您都需要對密鑰執行密鑰管理;這不像散列數字那麼容易。
在一般意義上,這個問題被稱為散列函式上的小輸入空間****,簡而言之,簡單的散列是不安全的。
如果您散列數據(這裡是電話號碼)並且攻擊者試圖找到與散列值匹配的輸入值,則稱為原像攻擊。在安全的密碼散列函式中,圖像前攻擊需要 $ \mathcal{O}(2^n) $ -時間 $ n $ 是散列函式的輸出大小,在 SHA256 中 $ n=256 $
如果輸入空間很小,這會給攻擊者帶來巨大的提升,也就是說他們只能暴力破解小空間。如果儲存 10 位電話號碼,則攻擊者只需搜尋 $ \approx 2^{34} $ -space 和 if 15 那隻能 $ \approx 2^{50} $ . 即使是最後一個空間也可以通過良好的 GPU 實現,請參閱hashcat 性能。因此,需要一種方法來減慢攻擊者的速度或使其更加困難。
- 為了使攻擊更慢,可以首選慢速和記憶體困難的雜湊函式,如 Scrypt 或 Argon2id。這個數量可以根據目標的能力進行調整。例如,使用 100K 迭代將使攻擊者的時間減慢 100K 或將在有限的時間內減少他們的搜尋空間能力大約 $ 2^{16} $ . 作為上層算力,比特幣礦工的集體算力可以達到 $ \approx 2^{92} $ 一年內翻倍 SHA256。如果你的敵人有這種能力,減速將無濟於事。
另一種選擇是對每個數據使用鹽,如答案中所述,以及慢速和記憶體硬散列函式。這只會減慢攻擊時間並防止像彩虹表這樣的預先計算的表。攻擊者的執行時間將增加目標雜湊的數量。
- 為了使它更難,可以首選 HMAC,這是一個鍵控散列函式,也可以使用 SHA256 進行初始化。沒有密鑰的攻擊者沒有運氣攻擊雜湊值。另一種方法是加密。雖然電話號碼應該是唯一的,但如果使用 ECB 模式,可以使用一些攻擊來辨識號碼。攻擊者可以註冊並輸入一個目標電話號碼作為他們的電話號碼,以在數據庫中辨識目標位置。因此,應首選 Ind-CPA 安全模式,如 CBC 或 CTR。
HMAC 和加密都有一個額外的問題需要解決。密鑰的儲存。為此,可以首選硬體安全模組 (HSM)。無法從模組中提取密鑰,並且可以在這些設備上執行 HMAC 和加密。如果攻擊者訪問使用 HSM 的應用程序伺服器,唯一的希望是他們有有限的訪問權限將 HSM 用作從站。
**結論:**使用加密或 HMAC。如果擔心失去或訪問密鑰,請使用 HSM 在 HSM 上儲存和執行加密/HMAC。