為什麼 PBKDF2 將散列函式的迭代異或在一起?
PBKDF2 的定義指出,我通過多次遞歸呼叫偽隨機函式來獲得派生密鑰(1) :
$ U_1 = PRF(password, salt) $
$ U_2 = PRF(password, U_1) $
…
$ U_n = PRF(password, U_n-1) $
然後標準將實際的密鑰材料定義
K
為$ K = F(password, salt, n) $
其中 F 是 $ U_1 \oplus U_2 \oplus \cdots U_n $
我不明白將塊異或在一起的目的是什麼。假設 PRF 是一個密碼學上的強函式,對塊進行異或有什麼幫助?為什麼是 $ U_n $ 關鍵材料本身不夠強?
該標準提到這些塊是 XORd 在一起*“以減少對遞歸退化為一小組值的擔憂”,*但我想我不明白這是怎麼發生的,因為密碼在每次迭代中都被回饋到函式中。
如果遞歸可以退化為一小組值,那是不是意味著雜湊函式的循環很短?這對加密雜湊函式來說不是一件壞事嗎?
(1)為簡單起見,假設密鑰與散列函式輸出的長度相同。
XOR 確實是為了防止假設的短週期。對於給定的密碼 $ P $ , 的序列 $ U_i $ 應該建立一個“rho”結構:在序列中的某個點,進入一個循環。為一個 $ n $ -bit 雜湊函式和隨機密碼,平均會有一個大小約為的“大”循環 $ 2^{n/2} $ 對於幾乎所有可能的鹽值,該循環將在遵循平均長度的“隊列”之後進入 $ 2^{n/2} $ . 但是,可能存在中心循環小於該密碼的密碼,也可能存在一些額外的小循環。找到一個產生一個小的中心循環的密碼,或者達到一個導致另一個小循環的鹽值是非常困難的,並且沒有已知的例子。然而 PBKDF2 的設計者認為 XOR 是應對這種風險的一種廉價方法:實際上,這意味著 $ U_i $ 將取決於隊列以及循環本身。
這裡有一個潛在的重要點:當你應用 PRF 時,即從 $ U_i $ 到 $ U_{i+1} $ ,空間“縮小”:不是全部 $ n $ 位值可以作為 PRF 的輸出。走得越遠,空間越縮小,直到到達“中心循環”。這意味著如果 $ F $ 僅使用 $ U_c $ (最後 $ U $ 值),然後生成的空間 $ n $ -bit 密鑰塊將小於 $ 2^n $ ; 換句話說,您將使用帶有 $ n $ -bit 輸出,你不會得到你的 $ n $ 位值得安全。XOR 旨在抵消這種影響。
儘管如此,據我所知,PBKDF2 結構從未以任何方式得到證明,因此我建議僅將其與輸出的散列函式一起使用 $ 2n $ 位,如果 $ n $ 位安全是要實現的。例如,對於 128 位安全性(合理級別),使用 SHA-256。因此,無論額外的 XOR 是否真的有益,大中心循環大小本身就足夠了。