使用散列函式創建 UID - 最合適的散列算法?
我有大約 100 萬個數據點,每個數據點都有一個 6 到 24 位的唯一整數:
exampleDataPointOne: 655092 exampleDataPointTwo: 333402221 exampleDataPointThree: 332021 ... exampleDataPointN: 903232211
我想通過雜湊函式執行這些唯一整數中的每一個,其目標是 1)保持唯一性,2)模糊底層整數值和 3)具有長度為 <= 34 的雜湊輸出。
我四處尋找適合的潛在雜湊算法,例如 BLAKE、md5 和 sha 系列雜湊。
鑑於我的要求,最可取的雜湊算法是什麼?
我想通過雜湊函式執行這些唯一整數中的每一個,其目標是 1)保持唯一性,2)模糊底層整數值和 3)具有長度為 <= 34 的雜湊輸出。
你需要非常清楚你所說的“模糊”是什麼意思。這裡的基本問題是您的值看起來很可能會受到暴力猜測攻擊——就像密碼一樣。這意味著,如果你對你的值應用一個公開的、無密鑰的散列函式,你就會使自己遭受對密碼非常成功的攻擊——特別是對未加鹽密碼的攻擊。
如果通過“模糊”你真的意味著攻擊者不應該能夠找出每個雜湊對應的數字,那麼你的解決方案需要包含一個密鑰,並且該密鑰需要受到保護。這比使用 SHA-2 還是Blake2重要得多。(PS:不要將 MD5 用於任何事情!如果您需要將秘密合併到計算中,請不要以臨時方式進行 - 使用 HMAC-SHA2 或 Blake2 的可選密鑰支持)。
注意:此答案之前建議使用作為 SHA-3 一部分標準化的 SHAKE 函式,但由於我誤解了 FIPS-202 中使用的符號,因此已對其進行了編輯
我建議使用鍵控 MAC,截斷到適當的長度。該密鑰將用作此案例的“域分隔符”,並防止字典攻擊針對小輸入空間(如果這是一個問題)。如果第三方也需要為您的應用程序計算雜湊值,您可以與第三方共享密鑰。
如果您正在處理最近的 x64 硬體,由於片上 SHA2-256 的硬體支持,我會根據需要選擇截斷的HMAC-SHA2-256 。
在沒有硬體 SHA2-256 指令的平台上,鍵控BLAKE2可能是性能更高的選擇(BLAKE2 可以直接鍵控並用作安全 MAC,而無需使用 HMAC 結構)。