使用 HMAC 可以防止雜湊表 DoS 攻擊嗎?
對於由第三方提供值的散列集,一個問題是攻擊者可以通過創建許多值來執行拒絕服務攻擊,這些值都落入散列表的一個儲存桶中,導致訪問需要線性時間而不是攤銷恆定時間和系統過載。(因為它是一個集合,我們假設不儲存精確匹配的數據,所以你不能通過多次寫入相同的值來填滿儲存桶。)針對這種攻擊的最佳防禦是什麼?
使用加密散列會有所幫助,因為它很難生成具有特定散列的值——但是如果有 N 個儲存桶並且 N 不是超級大,那麼簡單地生成隨機數據仍然會產生大約每 N 次嘗試一次的命中。因此,如果攻擊者知道(或可以猜測)您的雜湊函式,他們仍然可以通過預先計算一堆衝突值然後僅上傳這些值來相當容易地攻擊您的系統。
似乎 HMAC / 某種其他類型的鍵控散列將是防止攻擊者知道他們的數據最終將進入哪個儲存桶的好方法,但它也會導致使用原始散列函式散列到同一儲存桶的值在桶中均勻分佈(看似隨機)?
此外,如果這樣可行,我想知道是否需要 HMAC,或者使用其他一些使用秘密的散列方法(例如使用 BLAKE2/3 散列系列的鍵控版本)是否也可以。
但是如果有 N 個桶並且 N 不是特別大,那麼簡單地生成隨機數據仍然會產生大約每 N 次嘗試一次的命中。
更改雜湊函式不會改變這一事實。對於添加一堆隨機數據的使用者,應該有其他緩解措施,例如速率限製或更改資料結構。
您打算如何獲取 HMAC 的密鑰?如果所有內容都相同,則底層雜湊函式中的雜湊衝突將轉換為 hmac 衝突。如果它是從數據中推導出來的,那麼攻擊者的工作就稍微困難一些;他們必須在每次計算中有效地計算三個雜湊值(一個用於密鑰派生,兩個用於 hmac)而不是一個。如果它是隨機的,您將如何從表中檢索數據?正如您在評論中提到的,我們不關心雜湊衝突,而是關心 mod N 的雜湊衝突。在這種情況下,HMAC 足以阻止攻擊者計算將雜湊到同一個桶的數據。如果 HMAC 結構對您的應用程序來說過於昂貴,您可以使用 SipHash 之類的東西。