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

Oti*_*iel 8 c# passwords hash cryptography pkcs#5

这是我使用.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);
Run Code Online (Sandbox Code Playgroud)

现在,我知道盐的大小并不重要(只要它足以确保随机盐是独特的),但是密钥大小呢?更长的密钥是否能提供更强的安全性来抵御攻

(注意:
1.性能问题不在我这里导入,显然更长的盐或更长的密钥需要更多的时间GetBytes来返回一个值
.2.我想用这个"哈希"来存储它们数据库,以后不要在加密方案中使用它们)

pou*_*pou 6

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

aes.Key = deriveBytes.GetBytes (16); // 16 * 8 = 128 bits
Run Code Online (Sandbox Code Playgroud)

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

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

  • "使用PKCS#5 v2(或更早版本)将比使用盐渍哈希或HMAC花费更长时间(迭代次数)"这不是您首先想要使用PKCS#5的原因吗?更快的算法更容易运行字典攻击等. (2认同)