Key-Derivation

拆分 PBKDF2 的輸出是否安全?

  • January 30, 2019

我想知道拆分由 PBKDF2 生成的密鑰以派生兩個密鑰是否是一種安全的做法。

具體來說,在我的系統中,我需要派生兩個密鑰。一種用於客戶端使用的對稱密碼,另一種用於通過發送到伺服器來驗證使用者。第一個密鑰永遠不會發送到伺服器,因此只有客戶端知道如何解密密文。

  1. 使用者輸入電子郵件和密碼;
  2. 導出k <- pbkdf2(password: password, salt: email, alg: 'sha256', iteration: 10000, dkLen: 512)
  3. 拆分k(k0, k1) = (k[0:255], k[256:512]). 用作k0客戶端密鑰並發k1送到伺服器。

我的想法是,以這種方式拆分密鑰沒有風險,因為密鑰是偽隨機字元串。有任何想法嗎?

它是安全的,因為這些位是不相關的。它不安全,因為它通過為攻擊者提供優勢而消除了一些安全性。

PBKDF2 確實被定義為生成動態數量的密鑰材料。輸出的位是相互獨立的,擁有輸出的任何部分都不會為您提供有關其餘輸出值的任何資訊。所以 $ k_0 $ 和 $ k_1 $ 是不相關的,因為 PBKDF2 確實是一個偽隨機生成器。偉大的。

但是,PBKDF2 也有一個設計問題:如果您需要的不僅僅是雜湊函式的輸出(在本例中為 SHA-256),那麼它需要您再次執行所有迭代以計算下一個輸出塊。這是有問題的,因為對手可能不需要自己執行這些計算

例如,如果攻擊者只需要與加密的值進行比較 $ k_0 $ 那麼對手不需要計算 $ k_1 $ : 只是計算和驗證 $ k_0 $ 猜密碼就夠了。另一方面,你需要 $ k_1 $ 因此,您將不得不執行所有這些工作,而不會從中獲得任何好處。由於對手只需要一半的工作,顯然你失去了一點安全性。而且,由於您的密鑰都是散列函式的確切輸出大小,因此您無意中讓對手很容易。

有幾種方法可以解決這個問題。首先,您可以使用更現代的功能,例如 Argon2(首先檢查安全的 Argon2 配置)。其次,可以使用 PBKDF2 的輸出並使用基於密鑰的密鑰派生函式或 KBKDF(例如 HKDF,例如k0 = HKDF(k, "Enc")和)從中派生兩個密鑰k1 = HKDF(k, "Auth")

最後,您可以使用 SHA-512 “破解” PBKDF2 並讓它提供 512 位,您可以將其拆分。該解決方案顯然不能很好地擴展,但是如果您無法使用其他選項,它會很有用,而且實現起來非常簡單;畢竟,您只需要更改雜湊函式即可。

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