Aes
加密文件時為 AES-CBC 生成 IV 的最佳方法?
情況是我想使用對稱加密將一些資訊儲存在文件中。我將使用 AES-CBC 算法。使用者將記住密碼(這意味著它不會儲存在任何地方,而是儲存在文件所有者的大腦中)但是我擔心鹽和 IV 的管理。
從幾個來源我已經看到鹽必須是唯一的並且永遠不會重複使用(這實現了使用加密安全的偽隨機數生成器),但它可以以明文形式安全地附加到加密數據中。這是正確的嗎?
對於 IV,我看到了兩種不同的方法:
- 與鹽類似,隨機生成並以明文形式儲存。
- 從密碼和鹽派生它,與通過 AES 算法加密每個塊的密鑰相同。
哪種方式是首選/最安全的方式?
生成一個隨機 IV(當然使用加密安全的隨機生成器)並將 IV 附加到密文中。
某些加密模式不需要隨機 IV,但只要您的 RNG 工作正常,隨機 IV 就永遠不會出錯。靜脈注射不需要保密(這是一個術語問題——如果它必須保密,它就不會被稱為靜脈注射)。
在 CBC 的情況下,如果密鑰僅用於單個消息,則非隨機 IV 是安全的。您的密鑰顯然來自使用者密碼和鹽,這使得它對於這個密碼-鹽組合是唯一的——但是當您加密文件的新版本時,您是否總是要生成新的鹽?即使您目前這樣做,您確定您的程序的版本 3 不會做不同的事情並使用相同的密鑰加密多個文件嗎?
使用獨立於鹽生成的隨機 IV。維護成本可以忽略不計並且可以說是負數(它是一行程式碼,比解釋為什麼使用非隨機 IV 是安全的註釋要短),性能成本可以忽略不計。
不要忘記 CBC 只確保機密性,它不能保護文件不被修改。強烈考慮改用經過身份驗證的加密模式,這樣可以保護數據的機密性和真實性。
最後,或者更確切地說,首先,已經有很多庫和外掛可以做到這一點—— 你真的需要重新發明輪子嗎?