Key-Derivation

現代密碼散列函式可以在數學上排除並行計算嗎?

  • April 27, 2019

最近的密碼雜湊競賽提出了以下詳細的技術要求:-


API 應包括但可能不限於具有以下原型的函式:

int PHS(void *out, size_t outlen, const void *in, size_t inlen, const void *salt, size_t saltlen, unsigned int t_cost, unsigned int m_cost); 

補充說:t_costm_cost參數旨在分別參數化時間和記憶體使用情況,但這不是嚴格要求(只有一個參數可能有效,m_cost可能會影響時間等)。


原型不需要並行參數,但獲勝者(Argon2)有這樣的參數。因此,並行計算在該算法中佔有重要地位。

難道不能編寫一個不易受並行計算加速影響的函式嗎?因此,與其容納多個核心/執行緒,不如找到一種在數學上完全免疫的算法。這樣的功能不存在嗎?

如果您可以在合理的時間內計算出一個密碼雜湊 $ t $ 在您的電腦上——這是應用程序可用所必需的——那麼如果我有 $ p $ 和你一樣的不同電腦,我可以計算 $ p $ 同時散列 $ t $ ,再多的數學也無法阻止我。

這是一個非常簡單的密碼雜湊,它在您的電腦上在 1 秒內完成,這是可用性的障礙:

PWHASH1:在加鹽密碼上迭代 SHA-512 的次數足以在電腦的單個核心上花費 1 秒。

如果您的電腦有四個核心,那麼您可以做得更好——並且仍然可以在 1 秒內獲得密碼散列:

PWHASH2:在加鹽密碼雜湊核心編號(0、1、2、3)上迭代 SHA-512 足夠多次,在單個核心上需要 1 秒,但在四個核心上並行執行,然後使用 SHA- 對結果進行雜湊處理512.

現在假設我有八個核心,它們的執行速度與您電腦的核心相同。一分鐘內,我可以使用 PWHASH1 嘗試 480 個密碼,但使用 PWHASH2 我只能嘗試 120 個密碼。

因此,argon2 的並行度參數讓您可以投入更多的資源而不是時間——電腦的並行度——來使攻擊者的工作更加困難。(同樣適用於 argon2 的記憶體參數。)

雜湊密碼很容易被攻擊者並行化;您只需在不同的執行緒甚至不同的處理器上執行單獨的嘗試(不同的密碼)。

並行化密碼雜湊函式或 PBKDF 可以為您提供更快的響應時間(使用者時間,而不是 CPU 時間),而攻擊者仍然必須執行與執行緒一起執行的所有工作相同的工作量。

如果您不希望這樣,只需將並行化因子設置為 1(執行緒),您將擁有一個非並行 Argon2 變體。


難道不能編寫一個不易受並行計算加速影響的函式嗎?

好吧,你不能讓攻擊者避免一次測試多個密碼,所以在這種情況下:不。密碼雜湊本身當然需要執行所有工作,其中大部分是按順序執行的。

因此,與其容納多個核心/執行緒,不如找到一種在數學上完全免疫的算法。這樣的功能不存在嗎?

好吧,在使用的原語中總會有一些並行性,但是是的,大多數密碼雜湊都是順序的,除非你明確告訴他們使用並行性。


密碼雜湊可用於驗證密碼,同時保護密碼免受對被盜數據庫(或整個伺服器)的*離線攻擊。*您無法使用對這些儲存值的並行性來防範對手。但是,當然可以避免在線上驗證期間執行並行攻擊。

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