7

您能否告诉我以下是否是安全散列密码以存储在数据库中的好方法:

    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();

    }

提前谢谢了。

4

2 回答 2

7

您使用 PBKDF2-SHA1,它不错但不是很好。Bcrypt 稍微好一点,scrypt 更强大。但是由于 .net 已经包含一个内置的 PBKDF2 实现,所以这是一个可以接受的选择。

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

如果你愿意,你可以把盐分成两部分。一个与用户一起存储在数据库中,每个人都不同,一个共享部分存储在其他地方。这获得了两者的优点。

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

于 2012-08-31T16:04:13.623 回答
5

它可以改进。首先,您应该改用bcrypt。现在,使用 GPU 可以很容易地破解 SHA-512 等传统哈希。问题是这些散列是为速度而设计的,这与您在密码散列中想要的相反。Bcrypt 是自适应散列算法的一个例子。它可以配置为花费“很长时间”(但仍然不会导致系统出现性能问题)以使暴力破解变得困难。

您还希望使盐对每个用户都是唯一的。

有关如何安全地散列密码的更多信息,请参阅此问题

于 2012-08-31T16:02:12.273 回答