拉伸非鍵有意義嗎?
我在想拉伸鹽。
按鍵拉伸可以很好地防止暴力猜測,並假設您的系統沒有受到損害。
單向加鹽使您必須為每個密碼計算 * n 並假設您的系統已受到威脅。
假設系統受到破壞,找到了派生的鹽,找到了靜態密鑰,那麼在那時拉伸任何東西是否有意義?
當使用加鹽的、擴展密鑰的 KDF(如 PBKDF2 或 scrypt)時,您實際上是在擴展鹽和密碼。也就是說,你計算的是
$$ \rm key = KDF(password, salt) $$
在哪裡改變 $ \rm password $ 或者 $ \rm salt $ 需要慢 $ \rm KDF $ 函式被完全重新計算。
事實上,如果更改鹽不需要重複整個密鑰派生過程,這將顯著降低鹽的有效性:而不是要求 $ t \times n \times m \times k $ 測試時間 $ n $ 密碼 $ m $ KDF 迭代次數為 $ k $ (一次迭代大約需要 $ t $ 時間),輕鬆更改鹽的能力將允許攻擊者僅使用大約 $ t \times n \times (m + k) $ 時間。
特別是,將此與提取然後擴展樣式的 KDF (例如 HKDF )進行對比,用於從單個原始密鑰或密碼派生多個密鑰,具有以下一般形式:
$$ \begin{aligned} \rm PRK &= \rm KDF_{extract}(password, salt) \ \rm key_{\it i} &= \rm KDF_{expand}(PRK, info_{\it i}) \ \end{aligned} $$
在哪裡 $ {\rm info}i $ 是一個唯一的字元串,用於標識其目的 $ {\rm key}i $ 正在導出。這種 KDF 的優點之一是,而 $ \rm KDF{extract} $ 如果與密碼輸入一起使用,則需要很慢*, $ \rm KDF{expand} $ 功能可以很快,允許從一個密碼中有效地導出許多密鑰。
這裡要注意的重要一點是,因此,鹽和資訊字元串扮演著非常不同的角色:鹽可以而且應該改變以降低對多個密碼的並行暴力攻擊的有效性,而改變資訊字元串不會提供任何這種保護,因為更改資訊字元串不需要重新計算緩慢的提取階段。
(: 請注意,HKDF 標準中定義的提取函式並不*慢,不應該用於基於密碼的密鑰派生。但是,該標準確實包含了一項規定,可以用任何其他均勻分佈的源有效地替換提取函式偽隨機密鑰,例如 PBKDF2。)