Encryption
加密 32 字節私鑰的安全方法
我在 Web 應用程序的客戶端使用 32 字節 EC 私鑰。這些密鑰應該安全地儲存在伺服器數據庫中。在用 javascript 將密鑰發送到伺服器之前,應加密 (AES)。當客戶端通過登錄憑據進行身份驗證後,密文將提供給客戶端。然後客戶端將解密密文以獲得私鑰。
任何有權訪問數據庫密文的人都不應該能夠導出私鑰。
從表面上看,ECB 似乎實際上很好,因為私鑰數據是偽隨機的,但一般不建議將 ECB 用於任何目的。在這種情況下哪種模式適合?據我所知,CBC 往往被用於類似的目的。
如果我使用 GCM,客戶端是否總是能夠驗證密文?因此,如果客戶端使用特定的加密密鑰加密了私鑰並且只保留了加密密鑰,那麼伺服器就不能偽造 IV、身份驗證標籤和密文的組合,而這些組合可以使用相同的密鑰進行解密?
我不確定這種身份驗證是否有用,因為客戶端已經信任下載的客戶端軟體,但我想這可能是“為什麼不呢?”的問題。在那種情況下,使用 GCM 會有缺點嗎?當然需要儲存更多數據,但不會很多。
PBKDF2 是為密碼派生 AES 密鑰的合理方法,對嗎?PBKDF2 是否有任何弱點或任何其他算法的優勢?
最後,我閱讀了有關 AES 密鑰包裝算法的資訊,儘管我對此了解不多,而且似乎沒有很多開源實現。
SIV 是專門為此設計的模式。SIV-AES 將是一個不錯的選擇,但它與 AES-wrap 存在相同的問題;沒有很多實現。如果你使用 GCM,你應該確保 IV 是唯一的(如果你的明文不是隨機的,否則你會遇到問題)。
至於基於密碼的密鑰派生函式:是的,PBKDF2 很好,迭代次數足夠高。對於這種數據,儘管我真的會確保密碼片語具有足夠的熵。您可以考慮 scrypt 具有相對較高的記憶體使用率和可能的附加密鑰訪問限制/身份驗證。