從 PBKDF2 生成的 AES 256 位密鑰有多安全
我正在使用 CryptoJS AES 256 加密:
CryptoJS.AES.encrypt(realData, generateKey(passphrase), {iv: iv});
秘密是通過以下方式生成的:
function generateKey(passphrase) { const salt = CryptoJS.lib.WordArray.random(128 / 8); const key256Bits = CryptoJS.PBKDF2(passphrase, salt, { keySize: 256 / 32, iterations: randomNumber, }); return key256Bits; }
我是新手,想知道上面的 256keybits 有多安全?
有人可以使用蠻力找出 256keybits 的十六進制、base64 編碼字元串,iv 而不關心密碼。
然後轉換真正的 256keybits,iv 用於解密 AES 加密中的 realData?或者256keybits可以是蠻力嗎?
謝謝!
的值
iterations: randomNumber
不應該是隨機數。這是一個控制 PBKDF2 成本的迭代計數。它應該在應用程序中設置得盡可能高,並且 PBKDF2 對密碼搜尋提供的保護隨著該參數線性增長。在下文中,我假設一個高iterations
值(比如十萬的基線),並且以某種方式salt
儲存。我還假設它使用了 HMAC-SHA-1(預設)或 HMAC-SHA-256(也很常見)。據我們所知,所描述的主要缺點是可以通過執行 generateKey 來測試密碼,然後使用已知的 AES 密碼測試相應的密鑰。那是*“不關心密碼”*嗎?這對我來說不清楚。
問題是,攻擊者可以使用 GPU、FPGA 或 ASIC 以非常高的速度執行 PBKDF2。當
iterations
高時(應該如此),PBKDF2 是generateKey
密碼搜尋的瓶頸。因此,攻擊者搜尋密碼的速度比使用 CryptoJS 的普通使用者快幾個數量級。從使密碼搜尋變得困難的角度來看,這是問題的主要目標,因此當涉及到強大的對手時,PBKDF2 是最糟糕的使用備用 CPU 能力進行密鑰拉伸的方法之一。Argon2、scrypt 甚至 bcrypt 更好的選擇。您決定 NIST以前推薦 PBKDF2是否是巧合,並且仍然不要求使用更好的東西;就像它以前推動的Dual_EC_DRBG 一樣,其明顯目的是讓美國情報部門破解這種加密貨幣。Hanlon 的剃刀可能適用,但我對 NIST 的科學家有更高的敬意。