我正在升级旧版 asp.net 应用程序中的密码哈希函数。
它使用带有默认 SHA1 的 Rfc2898DeriveBytes。我现在已经将应用程序升级到 .Net 4.7.2,所以我现在可以选择更好的散列算法。
到目前为止,这是我的功能...
public static string GeneratePasswordHash(string password)
{
var private_key = "{my-secret-key}";
using (var derived_bytes = new Rfc2898DeriveBytes(password + private_key, 32, 10000, HashAlgorithmName.SHA384))
{
byte[] hash = derived_bytes.GetBytes(64);
byte[] salt = derived_bytes.Salt;
byte[] combined_hash = new byte[96];
System.Buffer.BlockCopy(salt, 0, combined_hash, 0, 32);
System.Buffer.BlockCopy(hash, 0, combined_hash, 32, 64);
return Convert.ToBase64String(combined_hash);
}
}
不过,我不确定如何选择合适的密钥和盐大小。目前我分别选择了 32 和 64 字节,但这些实际上只是随意选择的。我知道盐的最小大小是 8 个字节,但我真的不知道为什么我会选择更大的盐而不是更小的盐。
还有某种经验法则来决定盐和密钥大小之间的比率吗?
性能并不是真正的考虑因素,因为它的运行频率永远不会足够频繁,不会给服务器带来任何明显的负载。
同样,散列的存储空间也非常无关紧要。散列密码是否需要 88 个字符或 128 个字符,并没有真正的区别。
以前盐和密钥大小都是 32 字节。如果我保持不变,这是否会以某种方式否定更改为 SHA384 的好处,因为我的最终哈希将与以前的大小相同?
根据我对散列算法的基本了解,更大的数字 = 更好的安全性。但是,如果从安全角度来看这样做完全没有意义,我不想选择非常大的密钥大小等。