簡體   English   中英

將PBKDF2鹽重新用作IV的AES / GCM:危險嗎?

[英]Reusing PBKDF2 salt for AES/GCM as IV: dangerous?

我正在開發一個加密實用程序類,可將其重用於常見操作。

一種非常常見的情況是使用用戶提供的密碼來加密純文本。
在這種情況下,我使用PBKDF2派生有效的AES密鑰,然后在GCM模式下使用它來加密明文。

一些代碼:

// IV_LEN = 96
// ITERATIONS = 1000 ~ 4000
// KEY_LEN = 128 ~ 256
// TAG_LEN = 128
public static String encrypt(byte[] plain, char[] password) throws GeneralSecurityException
{
    SecureRandom rng = SecureRandom.getInstanceStrong();
    byte[] iv = new byte[IV_LEN / 8];
    rng.nextBytes(iv);

    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
    SecretKey derivedKey = factory.generateSecret(new PBEKeySpec(password, iv, ITERATIONS, KEY_LEN));
    SecretKey secretKey = new SecretKeySpec(derivedKey.getEncoded(), "AES");

    Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, secretKey, new GCMParameterSpec(TAG_LEN, iv));

    byte[] encrypted = c.doFinal(plain);

    Encoder encoder = Base64.getUrlEncoder().withoutPadding();

    return encoder.encodeToString(iv) + ":" + encoder.encodeToString(encrypted);
}

目前,我還將PBKDF2鹽(96位-SecureRandom)也用作AES / GCM加密的IV。

salt和IV均可公開,但不應重復使用。

是否應該理解,不應在相同的功能/服務/算法中重用它們,或者不應該在任何地方重用它們?

修改此方法以生成不同的鹽和IV很容易,但是有理由這樣做嗎?

謝謝

請注意,您只要更改鹽並因此更改密鑰,就可能不需要重新生成隨機IV。 如果每次(重新)加密時都沒有更改鹽,那么您確實需要單獨的IV,否則您可能會將信息泄漏給對手。

您可以將鹽和IV保持相同。 但是通常更容易從密碼和鹽中導出IV和密鑰。 如果您將PBKDF2與SHA-512哈希一起使用,這很容易:只需從生成的哈希中獲取128、192或256位AES密鑰,然后再獲取其他128位作為IV並使用。

如果需要多個密鑰,或者使用較小的哈希,則可能需要從PBKDF2的結果派生更多密鑰。 在這種情況下,最好將PBKDF2的結果標記為主密鑰,並從中進行N個密鑰派生,每個密鑰派生一個,對IV派生一個。 您可以為此使用例如HKDF,Bouncy Castle有一個實現(我為其提供了原始源代碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM