这是一种安全的密码散列方法吗



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

    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更高的workactor。弄清楚什么性能是可以接受的,并进行相应的调整。我不会低于10000,在某些情况下(磁盘加密),一百万也是可以接受的。

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

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

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

最新更新