Encryption
AES 加密密鑰和 HMAC 的密鑰派生
好的,所以我有兩種選擇如何為 AES 加密和 HMAC 派生兩個密鑰,它們如下所示:
- 在使用者密碼上執行 BCrypt,然後使用 java 中 HKDF 的 bouncy castle 實現將密鑰從 31 字節擴展到 64 字節,然後將結果拆分為兩個 32 字節的密鑰。
- 使用不同的 salt 在使用者密碼片語上執行 Bcrypt 兩次,然後使用 java 中 HKDF 的 bouncy castle 實現將兩個密鑰從 31 字節擴展到 32 字節。
我的問題是哪種方式更好?(更安全)
注意:如果您確實有答案,請以易於理解的方式留下您的推理。
在這兩個選項中,如果對手有辦法檢查任一 AES 密鑰,則可以嘗試粗暴的密碼猜測攻擊,而 BCrypt 是主要的防線。
為了不斷努力,選項 2 強制將BCrypt 中的成本參數減半,因此比選項 1 更容易受到密碼猜測的影響。
BCrypt 的輸出被描述為 31 字節,並且可能有 192 位熵,不包括cost和salt。如果是這樣,那麼在可預見的未來,這將比安全所需的熵更多,並且可以接受所有密鑰都具有更大大小的命令要求。
因此,選項 1 絕對是兩者中最好的;但是,正確實施scrypt會更加安全,並且作為獎勵,不需要額外的東西來生成所需數量的密鑰材料。