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

时间:2011-11-09 16:28:47

标签: c# hash cryptography passwords pkcs#5

这是我用来“哈希”(或派生密钥,如PKCS标准的PBKDF2实现中所调用的)密码字符串,提供Rfc2898DeriveBytes类的代码在.NET中:

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.性能问题不在我这里导入,很明显更长的盐或更长的密钥需要更多的时间GetBytes返回一个值。
2.我想使用这个“哈希”将它们存储在数据库中,而不是在加密方案中使用它们之后)

2 个答案:

答案 0 :(得分:6)

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

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

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

一般说明(对于性能重要的人):使用PKCS#5 v2(或更早版本)将比使用 salted 哈希需要更长时间(迭代计数)或HMAC。

答案 1 :(得分:0)

keysize是所需键的大小;因此,如果您想获得一个大的派生密钥,请使用更大的keySize。

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

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