盐与 IV 用于PKCS5_PBKDF2_HMAC

salt vs. iv for PKCS5_PBKDF2_HMAC

本文关键字:PBKDF2 HMAC PKCS5 IV 用于 盐与      更新时间:2023-10-16

理解PKCS5_PBKDF2_HMAC()需要并返回派生密钥

并且该GCM<AES>::Encryption.SetKeyWithIV()需要一个 iv(以及派生密钥

PKCS5_PBKDF2_HMAC())和ivGCM<AES>::Encryption.SetKeyWithIV())使用相同的值是否安全 - 或者它们应该不同?

对盐(在PKCS5_PBKDF2_HMAC()中)和IV(在GCM::Encryption.SetKeyWithIV()中)使用相同的值是否安全 - 或者它们应该不同?

是和不是。的 - 您可以使用 PKCS5_PBKDF2_HMAC 的输出来生成盐、iv 或键。 - 您不应该重复使用这样的参数。

通常,您会执行以下操作。它使用唯一的标签,因此派生参数不能相同。

string password = "super secret password;
string label = "Key derivation with IV";
size_t length = password.length() + label.length();
unsigned int count = 5000;
SecByteBlock key(32 /*Key*/ + 16 /*IV*/);
PKCS5_PBKDF2_HMAC<SHA1> pbkdf2;
pbkdf2.DeriveKey(key, key.size(), 0, (unsigned char*)(password + label).data(), length,
    NULL /*salt*/, 0 /*salt length*/, count);
GCM<AES>::Encryption encryptor;
encryptor.SetKeyWithIV(key, 32, key+32, 16);

上面的标签有助于使派生独一无二。

如果您提取盐,则您的标签可能是"Salt derivation for X" 。在这种情况下,您将从 KDF 获得不同的值。

在上面,可以应用 KDF 两次。首先,不加盐地涂抹以产生盐(使用独特的标签)。其次,使用盐派生密钥和iv(使用先前生成的盐和唯一的标签)。