為什麼 KDF 的輸出長度應該與底層 OWF 相同?
報價:
密鑰派生函式選擇的輸出長度應該與底層單向函式輸出的長度相同。
有人可以幫忙解釋一下好處和顧慮嗎?
這對於定義不明確的 PBKDF(例如 PBKDF2)將是一個好處。如果您要求的不僅僅是單向函式的輸出,那麼 PBKDF2 會重新迭代所有迭代。這需要伺服器執行額外的計算。然而,攻擊者可能能夠驗證猜測的密碼是否正確*,而無需經過相同數量的迭代*。
例如,如果您在按順序使用 PBKDF2 - SHA-256 時將輸出拆分為 256 位密鑰和 128 位 IV,就會出現這種情況。將首先計算密鑰,然後為 IV 重複整個散列工作。但是攻擊者只需要前 256 位來確認猜測。
一些較舊的 KBKDF 和 PBKDF,例如 KDF1/2 和 PBKDF1 也根本不允許輸出超過單向函式的輸出大小。
較新的 KDF,例如 HKDF(基於密鑰的 KDF 或 KBKDF)和 Argon2(基於密碼的 KDF 或 PBKDF)經過專門設計,以允許比單向函式更多的輸出。但是應該記住,從只能提供 160 位安全性的函式中檢索 256 位密鑰不會為您提供 256 位安全性。
這可能是給定聲明的主要原因。
在我看來,輸出大小需要精確地是單向函式的輸出大小是胡說八道。要求 512 位輸出並將其拆分為兩次 256 位是完全合理的,而單向函式僅提供 256 位的安全性。使用兩個標籤並執行兩次KBKDF會更好,但這並不一定更安全。
除此之外,請求比單向函式提供的字節更少的字節當然是完全有效的。
通常,輸出大小是 KDF 的配置參數。但是,如果您要求比單向函式提供的更多位,您可能需要考慮使用最新的 KBKDF 或 PBKDF。只要您不要在 KDF 提供的關鍵強度方面自欺欺人,您就應該是完全安全的(至少在理論上:規範/實現失敗和 KDF 的災難性中斷不在此保險範圍內)。