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

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

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

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

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

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

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

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

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