Encryption

使用 PBKDF2 輪換密碼

  • June 27, 2016

加密很難。謝謝你幫助我學習。

我的加密方案目前如下所示:

  1. 是露天存放的
  2. Secret是使用者的密碼,只有他們自己知道
  3. EncKey||AuthKey = PBKDF2( Secret , Salt , n) 其中 n = 手數
  4. 我的加密有效載荷由IV||密文||HMAC組成
  5. IV = 安全隨機字節,每個有效負載唯一
  6. 密文= AES-256 CBC(EncKeyIV明文
  7. HMAC = HMAC-SHA1( AuthKey , IV||密文)

現在,我想更改Secret。就目前而言,這將使我所有已經加密的數據都無法讀取。所以,我想保持相同的EncKey

以下將是一個安全的方案嗎?

  1. EncKey||AuthKey = 安全隨機字節,選擇一次
  2. PwdEncKey||PwdAuthKey = PBKDF2(秘密,, n)
  3. EncKeyAuthKey如上所述加密,但使用PwdEncKeyPwdAuthKey
  4. 其他所有內容都使用EncKeyAuthKey加密和簽名

為了輪換我的密碼,我可以解密具有EncKeyAuthKey (現在永遠不會更改)的有效負載,並使用新派生的**PwdEncKeyPwdAuthKey重新加密它。

將EncKeyAuthKey與它們加密的數據一起儲存在加密的 blob 中是否會削弱我的安全性?有沒有更聰明的方法來做到這一點?

不,包裝數據密鑰集對我來說似乎是個好主意。它非常標準,甚至可以與硬體模組一起使用。

**請注意,當您選擇此方案時,您的舊密文仍將依賴於舊秘密(密碼)的安全性!**如果 $ Enckey $ 曾經有人猜測它可以通過解密(第一部分)你的密文來確認。


有一種更有效的方法:您可以簡單地使用從舊密鑰和新密鑰計算的密鑰之間的 XOR 計算位級別的差異。然後將該差異與密文一起儲存。因此,只需與新創建的密鑰進行 XOR 即可檢索舊密鑰以檢索舊密鑰。

這在 CPU 方面效率更高,並且可能需要更少的位(如果使用 CBC 填充)。不過,我仍然會選擇您目前的方案。XOR 方法不太靈活,如果任何數據密鑰洩露,它將暴露您的新主密鑰。


筆記:

  • 我不會要求 PBKDF2 提供太多輸出,而是使用另一個 KBKDF(例如 HKDF)從派生密鑰中分離出多個密鑰;
  • PBKDF2 需要一個迭代計數(工作因子)作為配置參數,這似乎是缺失的;
  • HMAC 可以配置為使用 SHA-1,但它不是 SHA-1,而且 SHA-1 不接受兩個輸入參數;
  • 您可以考慮使用 SIV 來加密您的密鑰,在這種情況下您不需要第二個身份驗證密鑰或 IV;
  • 您可能會考慮使用密文儲存隨機鹽;
  • 為每個單獨的加密設置完全隨機的數據密鑰更安全;
  • 補充1:如果在加密密鑰時不使用IV,那麼很容易發現哪個密文是用舊密鑰加密的。

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