基於普通密碼的密碼雜湊
如果攻擊者擁有一個包含 1,000 個使用者散列密碼的數據庫,這些密碼使用具有 128 位鹽的 SHA-256 散列,並且所有這些使用者都使用 10,000 個通用密碼。黑客需要多少雜湊才能恢復所有密碼?
我當時認為它只是 1,000*10,000 = 10,000,000 個雜湊,但我不確定鹽如何影響恢復雜湊的計算。
攻擊者需要做兩件事來恢復密碼:
- 計算一些輸入的散列
- 將計算出的雜湊值與某些使用者儲存的雜湊值進行比較
重要的是,散列操作比比較昂貴得多,特別是如果使用像 bcrypt、scrypt、PBKDF2 或 Argon2 這樣的目的而設計的算法(SHA-256 被設計為快速,用於數據驗證,所以不是一個好的選擇)。所以我們一般忽略比較,只統計需要生成多少個雜湊。
如果沒有 salt,相同的密碼總是會產生相同的雜湊值,因此給定一個常用密碼列表,攻擊者可以為每個密碼生成一次雜湊值,並將結果與他們想要的任意數量的儲存雜湊值進行比較。在您的範例中,這是攻擊全部使用者的10000 次雜湊計算的固定成本。
使用 salt,相同的密碼每次儲存時都會產生不同的雜湊值。攻擊者必須獲取他們的常用密碼列表,將針對特定使用者儲存的鹽添加到每個密碼中,然後計算雜湊值;然後對於下一個使用者,他們必須重新*做一遍,*因為鹽會導致相同密碼的完全不同的雜湊值。在您的範例中,每個使用者進行 10000 次雜湊計算,因此總共進行10000 x 1000 = 1000 萬次雜湊計算。
請注意,這些數字是為了盡可能高的成本,其中正確的密碼始終是攻擊者嘗試的最後一個密碼。實際上,正確的密碼有可能是第一個嘗試的,或者是第 100 個——最終,我們可以預期它平均每次測試大約一半的列表。對於未加鹽的情況,這沒有任何區別:攻擊者不能比計算所有 10000 個雜湊值更好,然後將其中一半與每個使用者進行平均比較。但是對於 salted 的情況,他們可以一次計算一個,一旦找到一個使用者就轉移到下一個使用者,因此預期的總成本剛剛超過 500 萬次雜湊計算。
這當然是一個簡化的現實模型:我們假設每個使用者都從完全相同的 10000 個密碼列表中隨機選擇;實際上,其中一些密碼會比其他密碼更常見,因此攻擊者可以先嘗試這些密碼,進一步減少他們需要計算的雜湊值數量。
它還假設攻擊者想要破解被盜數據庫中的所有密碼。如果他們只需要破壞一個帳戶,他們可以“廣度優先”執行搜尋,針對所有雜湊值嘗試使用一個最常見的密碼,然後轉向下一個最常見的密碼,並在找到任何匹配項後停止。
[向fgrieu 致敬,感謝他指出了上述幾個注意事項。]
加鹽使您必須針對每個雜湊嘗試每個候選。所以它是 1000 個使用者 x 10000 個目標雜湊值 x 10000 個單詞,這是最壞的情況。