密钥大小在Rfc2898DeriveBytes (PBKDF2)实现中的重要性

本文关键字:实现 重要性 PBKDF2 Rfc2898DeriveBytes 密钥 | 更新日期: 2023-09-27 18:14:11

这是我使用。net中提供的Rfc2898DeriveBytes类来"散列"(或派生密钥,如PKCS标准的PBKDF2实现中所调用的)密码字符串的代码:

int saltSize = 256;
int iterations = 1000;
int keySize = 20;  // The parameter I'm not sure of
var deriveBytes = new Rfc2898DeriveBytes("mypassword", saltSize, iterations);
byte[] salt = deriveBytes.Salt;
byte[] key = deriveBytes.GetBytes(keySize);

现在,我明白盐的大小并不重要(只要它足以确保随机盐是唯一的),但是密钥的大小呢?更长的密钥是否提供了更多的安全防范攻击?

(注:
1. 性能问题在这里对我来说并不重要,很明显,更长的salt或更长的key将花费更多的时间让GetBytes返回值。
2. 我想使用这个"哈希"将它们存储在数据库中,而不是在加密方案中使用它们)

密钥大小在Rfc2898DeriveBytes (PBKDF2)实现中的重要性

一般使用pkcs# 5 v2/RFC2898从用户密码创建一个对称的密钥。大小很重要,因为它必须与您将要使用的对称算法所需的大小相匹配。

aes.Key = deriveBytes.GetBytes (16); // 16 * 8 = 128 bits

然而,您似乎正在考虑保留密码的哈希值,而不是密钥,因此大小在您的特定情况下并不重要。如果你想要一个特定的值,你可以安全地将其固定为哈希大小(SHA1为20字节)。

一般注释(对于性能重要的人):使用pkcs# 5 v2(或更早)将比使用盐化的散列或HMAC花费更长的时间(迭代计数)。

keysize为所需键的大小;所以如果你想获得一个大的派生键,使用更大的keySize。

更大的keysize所需的时间与int(keysize/hashsize)成正比,因此您应该将keysize设置为至少与hashsize相同的长度。

另外,当在某些密码(例如AES(128 - 256位))中使用时,您应该使用推荐长度的派生密钥。