Aes

如何為 PBKD 功能生成備份密鑰?

  • October 1, 2015

我想使用 AES 加密一些文件,我會使用一些標準的 PBKD 函式從密碼中派生密鑰並將其用作 AES 加密密鑰。

我的問題是,如果使用者忘記了主密碼,那麼他就沒有輸入 PBKD 功能,因此無法獲得 AES 加密密鑰。

我應該使用什麼算法/技術與密鑰一起生成一種“備份密鑰”,最好是一個 16 位數字(所以 ~53 位密鑰),它也可以用來獲取正確的 AES 加密密鑰?鼓勵使用者在紙上寫下此密鑰並將其保存在安全的地方,以防忘記主密碼。

我的想法是使用 53 密鑰對客戶端使用的密碼進行實際加密,並在需要時將其解密並讓使用者替換或查看失去的密碼,但這會嚴重損害安全性,因為它降低了攻擊難度以獲取53位備份密鑰。

所以在我看來,我必須使用至少 128 位隨機密鑰(與主派生密鑰的強度相同),我可以將其轉換為 ~38 位十進制數或 32 位十六進制數。這比我喜歡的要長得多。

現在,雖然使用 53 位密鑰作為備份密鑰似乎是一個加密笑話,但當我們實際考慮平均密碼將是 8 位字母數字字元串時,使用小寫、大寫、數字和類似 10 個特殊字元的東西(如果只有使用者在至少這些準則…),這給了我們大約 72^8 ~~ 2^50 個選項,即 PBKD 函式的輸出密鑰相當於 50 位密鑰。128 位密鑰需要 PBKD 輸入至少是這些混合字元中的 21 個,我敢猜測使用者通常不會使用這麼長的密碼。

那麼您對我描述的場景有什麼建議和意見?謝謝。

另一個答案對兩次加密文件加密密鑰的建議很好,所以我只回答有關備份密鑰大小的部分。

現在,雖然使用 53 位密鑰作為備份密鑰似乎是一個加密笑話,但當我們實際考慮到平均密碼將是

$$ … $$

如果您使用平均密碼複雜性,那些選擇強密碼的使用者將會產生錯誤的安全感。如果你這樣做,你就不能要求例如 128 位安全性。

由於所討論的密鑰是備用密鑰,因此您可以選擇非常緩慢地使用它。然而,使用典型的密碼散列函式也意味著加密速度變慢,這可能是不可接受的。您可以改為使用有時稱為“密鑰強化”的方法,這基本上相當於丟棄隨機密鑰的位。你可以這樣做的一種方法:

  1. 生成隨機 128 位 AES 密鑰和隨機鹽。 $ k $ $ s $
  2. 將儲存在文件中。 $ s, H(s||k) $
  3. 截斷為初始位並將其儲存為備份密鑰。 $ k $ $ b $ $ k_b $
  4. 使用備份密鑰時,遍歷所有位值,計算並與儲存的雜湊值進行比較。當您找到匹配項時停止,因此。 $ 128-b $ $ x $ $ H(s||k_b||x) $ [Math Processing Error] $ k = k_b||x $

加密速度很快。解密需要預期的散列評估。現代 CPU(我的 4 核上的 SHA-256)上的典型速度至少為每秒 5000 萬次雜湊,您可以刪除 30 位()並始終在 <30 秒內解密。[Math Processing Error] $ 2^{127-b} $ $ b = 97 $

您還可以通過生成更短的並使案例如作為實際密鑰來使用更小的實際密鑰空間。例如,使用 64 位備份密鑰(16 個十六進製字元)和 32 位密鑰強化(解密時的一兩分鐘 CPU 時間),您將擁有 96 位安全性。[Math Processing Error] $ k $ $ H(k) $

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