为Rfc2898DeriveBytes选择盐和密钥大小

问题描述

我正在努力在旧版asp.net应用程序中升级密码哈希功能

它使用Rfc2898DeriveBytes和认的SHA1。我现在已将应用程序升级到.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,combined_hash,32);
        System.Buffer.Blockcopy(hash,64);

        return Convert.ToBase64String(combined_hash);
    }
}

我不确定如何选择合适的钥匙和盐的大小。目前,我分别选择了32个字节和64个字节,但实际上它们是任意选择的。我知道最小盐大小为8个字节,但我真的不知道为什么我会选择较大盐还是较小盐。

还有某种经验法则来决定盐和密钥大小之间的比例吗?

性能并不是真正的考虑因素,因为它永远不会足够频繁地运行以至于在服务器上造成任何明显的负载

类似地,散列的存储空间是无关紧要的。哈希密码需要88个字符还是128个字符,没有什么实质性的区别。

以前,salt和密钥大小均为32个字节。如果我保持不变,那么由于我的最终哈希值将与以前相同,这是否会否改变使用SHA384的好处?

根据我对哈希算法的基本了解,更大的数字=更好的安全性。但是,我不想选择多余的密钥大小等,如果这样做从安全角度来看完全没有意义。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)