Encryption
使用 PBKDF2 輪換密碼
加密很難。謝謝你幫助我學習。
我的加密方案目前如下所示:
- 鹽是露天存放的
- Secret是使用者的密碼,只有他們自己知道
- EncKey||AuthKey = PBKDF2( Secret , Salt , n) 其中 n = 手數
- 我的加密有效載荷由IV||密文||HMAC組成
- IV = 安全隨機字節,每個有效負載唯一
- 密文= AES-256 CBC(EncKey,IV,明文)
- HMAC = HMAC-SHA1( AuthKey , IV||密文)
現在,我想更改Secret。就目前而言,這將使我所有已經加密的數據都無法讀取。所以,我想保持相同的EncKey。
以下將是一個安全的方案嗎?
- EncKey||AuthKey = 安全隨機字節,選擇一次
- PwdEncKey||PwdAuthKey = PBKDF2(秘密,鹽, n)
- EncKey和AuthKey如上所述加密,但使用PwdEncKey和PwdAuthKey
- 其他所有內容都使用EncKey和AuthKey加密和簽名
為了輪換我的密碼,我可以解密具有EncKey和AuthKey (現在永遠不會更改)的有效負載,並使用新派生的**PwdEncKey和PwdAuthKey重新加密它。
將EncKey和AuthKey與它們加密的數據一起儲存在加密的 blob 中是否會削弱我的安全性?有沒有更聰明的方法來做到這一點?
不,包裝數據密鑰集對我來說似乎是個好主意。它非常標準,甚至可以與硬體模組一起使用。
**請注意,當您選擇此方案時,您的舊密文仍將依賴於舊秘密(密碼)的安全性!**如果 $ Enckey $ 曾經有人猜測它可以通過解密(第一部分)你的密文來確認。
有一種更有效的方法:您可以簡單地使用從舊密鑰和新密鑰計算的密鑰之間的 XOR 計算位級別的差異。然後將該差異與密文一起儲存。因此,只需與新創建的密鑰進行 XOR 即可檢索舊密鑰以檢索舊密鑰。
這在 CPU 方面效率更高,並且可能需要更少的位(如果使用 CBC 填充)。不過,我仍然會選擇您目前的方案。XOR 方法不太靈活,如果任何數據密鑰洩露,它將暴露您的新主密鑰。
筆記:
- 我不會要求 PBKDF2 提供太多輸出,而是使用另一個 KBKDF(例如 HKDF)從派生密鑰中分離出多個密鑰;
- PBKDF2 需要一個迭代計數(工作因子)作為配置參數,這似乎是缺失的;
- HMAC 可以配置為使用 SHA-1,但它不是 SHA-1,而且 SHA-1 不接受兩個輸入參數;
- 您可以考慮使用 SIV 來加密您的密鑰,在這種情況下您不需要第二個身份驗證密鑰或 IV;
- 您可能會考慮使用密文儲存隨機鹽;
- 為每個單獨的加密設置完全隨機的數據密鑰更安全;
- 補充1:如果在加密密鑰時不使用IV,那麼很容易發現哪個密文是用舊密鑰加密的。