c# – 这是一种散列密码的安全方法吗?

前端之家收集整理的这篇文章主要介绍了c# – 这是一种散列密码的安全方法吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
您能告诉我以下是否是安全地散列密码以存储在数据库中的好方法
public string CreateStrongHash(string textToHash) {

        byte[] salt =System.Text.Encoding.ASCII.GetBytes("TeStSaLt");

        Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(textToHash,salt,1000);
        var encryptor = SHA512.Create();
        var hash = encryptor.ComputeHash(k1.GetBytes(16));

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hash.Length; i++) {
            sb.Append(hash[i].ToString("x2"));
        }

        return sb.ToString();

    }

提前谢谢了.

解决方法

你使用PBKDF2-SHA1,这是体面但不是很好. Bcrypt好一点,scrypt更强.但由于.net已经内置了PBKDF2实现,这是一个可以接受的选择.

你最大的错误就是你没有得到盐.每个用户的盐应该是唯一的.简单地创建至少64位的随机值是标准做法.将它与散列一起存储在数据库中.

如果您愿意,可以将盐分成两部分.一个与用户一起存储在数据库中,每个用户都不同,一个共享部分存储在别处.这获得了两者的优点.

我还建议使用比1000更高的工作因子.找出可接受的性能,并进行相应调整.我不会低于10000,在某些情况下(磁盘加密)也可以接受一百万.

猜你在找的C#相关文章