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.我想用这个"哈希"来存储它们数据库,以后不要在加密方案中使用它们)
通常,您使用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 花费更长时间(迭代次数).