这是我用来“哈希”(或派生密钥,如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.我想使用这个“哈希”将它们存储在数据库中,而不是在加密方案中使用它们之后)
答案 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位)。