Password-Hashing

是否有一項測試可以說明密碼散列的安全性如何?

  • June 19, 2022

正如問題所說:是否有可以完成的測試或可以使用的軟體,能夠提供數字/數據來證明密碼散列的安全性?舉例來說,我想比較使用“phpass”可移植雜湊值與“使用 SHA3-512 作為 HMAC 的 PBKDF2”或使用 Argon2 的雜湊值之間的安全性。

我在一篇論文中看到的一種方法是,他們使用 Hashcat 來比較破解 SHA-1 和 SHA-3 的雜湊所需的時間。但是由於 Hashcat 似乎不支持“使用 SHA-3 作為 HMAC 的 PBKDF2”也不支持 Argon2,所以我認為我不能在任何時候以與該論文中相同的方式使用它來比較方法/方案/算法Hashcat 不支持。

所以我正在尋找的是一個測試/軟體,它可以用來向那些不喜歡密碼學的人展示“是否是密碼散列方案?方法?算法?比另一個更好”……

密碼散列或更一般的密鑰拉伸將低熵密鑰和公共鹽作為輸入,通過公共的、故意緩慢的偽隨機函式進行處理,產生最終儲存用於比較或用作密鑰的雜湊/派生密鑰。目標是讓攻擊者難以列舉輸入的可能/可能值,應用公共函式,並測試輸出是否與實際使用的一樣。

理想的“證明密碼散列有多安全的數字/數據”將是:攻擊者預計花費多少錢來計算大量輸入的輸出。

第一種方法是合法使用者的函式的計算成本,例如以 CPU 時間的毫秒數來衡量。在實踐中,這是由迭代計數控制的。對於合法使用者和攻擊者來說,增加迭代次數會增加函式的計算成本。當我們比較兩個僅通過迭代次數不同的實例時,迭代次數越高,保護越好。並且超過某個門檻值,這是成比例的,因為攻擊者的成本主要由這種迭代操作決定。因此,在給定的上下文中,迭代計數被設置為盡可能高;例如,不會對最終使用者造成明顯的延遲,也不會對伺服器運營商造成投資/電力/VM 計量成本。然後可以測量合法使用者的計算成本,例如 CPU 時間的毫秒數。

這個合法使用者度量的計算成本是有用的,只是因為所述成本限制了合法使用者可以設置的迭代次數。然而,帽子沒有給出關於攻擊者成本的有用資訊,因此沒有關於所提供保護的有用資訊;因此,不允許在不同的密碼散列函式之間進行有意義的比較。

為了說明合法使用者的成本和攻擊者的成本之間的巨大差異,我將採用一個常用的散列函式:PBKDF2 -HMAC-SHA-256。它有一個成本參數 $ c $ ,它控制它的迭代次數 $ U_{j+1}:=\operatorname{HMAC-SHA-256}(\mathrm{Password},U_j) $ . 一次這樣的迭代需要兩輪 SHA-256。 $ c $ 通常是 $ 10^3 $ 至 $ 10^7 $ . 在我現在使用的電腦上, $ 10^5 $ 迭代使用類似的能量¹ $ 5,J $ . 但是常見的比特幣挖礦硬體被宣傳為 $ 3.8\cdot10^{-6}J $ (很快 $ 2.1\cdot10^{-6}J $ ) 對於相同數量的 SHA-256。因此,使用最先進的 ASIC 的假設對手會以與合法使用者相同的能量成本散列一兩百萬個密碼。100美元的電費,每千瓦時 10 美分,PBKDF2-HMAC-SHA-256 在 $ c=10^5 $ , 他們會測試 $ 10^{15} $ 密碼。那是

  • 75個字元中的每8個字元的組合:大小寫字母、數字和13個特殊字元。
  • 每個XKCD 密碼策略平均生成 100 個密碼,這比大多數密碼要好得多。

即使州級對手的效率可能遠非如此(因為他們投資於 FPGA 等可重複利用的硬體),但可以肯定地說,他們可以破解人們記得的大多數密碼,因為它是 PBKDF2 和鹽, $ c=10^5 $ .

可以說,最重要的衡量標準是:合法使用者的相對效率與現有技術所能達到的水平相比。我建議以絕對值的形式取該數量的以 2 為底的對數。我們希望它盡可能接近 0。我們已經看到,對於我的 PC 上的 PBKDF-HMAC-SHA-256,我們大約是 20。重要的是,這在很大程度上取決於合法使用者使用的實現的優化。

降低該數量的最佳通用技術是:確保計算該函式需要大量 RAM,並且可以訪問該 RAM,並且無法對其進行優化。即,一個記憶困難的迭代hasing函式。這是scrypt開創的策略,並被它的現代繼任者Argon2 使用

(待續,希望如此)。


¹我正在計時 PBKDF2-HMAC-SHA-256 捆綁在 python 3.10.5 中

import timeit;print(timeit.timeit('import hashlib;hashlib.pbkdf2_hmac("sha256", b"tst", b"abc", 100000, dklen=16)',number=100))

產生5.1s,使功耗100W。

引用自:https://crypto.stackexchange.com/questions/100636