Hash
我應該使用密碼雜湊作為 AES256 密鑰嗎
作為標題,我有一個類似密碼的密碼(至少 8 個字元),然後用 argon2 進行散列(鹽是該密碼的 SHA256)。
然後將其用作 AES256 密鑰以及 CryptoJS.lib.WordArray.random(256 / 8) 生成的隨機 IV;
沒事吧?
還是我應該使用 IV 作為鑰匙?
鹽是該密碼的SHA256
不要將密碼片語的 SHA-256 用作鹽;隨機生成它,因此對於相同的密碼它是不一樣的。
CryptoJS.lib.WordArray.random(256 / 8);
不要使用 CryptoJS。從記憶體中,它錯誤地生成了隨機數,密碼的密碼方法使用/使用了一些損壞的 KDF,並且它不提供 AEAD 模式。
看看你是否可以改用libsodium.js。或者,還有Web Crypto API。不幸的是,我對 JavaScript 一無所知。
然後將其用作 AES256 密鑰
我想您目前正在使用 AES-CBC(CryptoJS 的預設設置)。它需要與 HMAC-SHA-256 或 HMAC-SHA-512 配對才能安全。
如果您切換到更好的庫,您應該只使用 AEAD 模式,如 AES-GCM 或 ChaCha20-Poly1305。然後,您不需要應用 HMAC,因為它們會為您驗證輸入。重要的是,對於大多數 AEAD 模式,您應該使用計數器 nonce(使用一次的數字),這意味著您在每次加密操作後使用相同的密鑰遞增它。
我應該使用 IV 作為鑰匙嗎?
不,IV 只能用作 IV,並且與密鑰的大小不同。Argon2 輸出應用作鍵。
連同隨機 IV
使用 AES-CBC,IV 對於每個加密操作確實應該是隨機且不可預測的。不應使用相同的密鑰重複使用它。您可以將其添加到密文輸出之前。