在.NET Core MVC应用程序中存储用户密码的最佳方法

3
请检查下面的类。我在这里进行密码哈希,然后比较这个密码哈希。现在我的问题是,安全地存储用户密码是否是最佳实践?请给予建议,并可以在我的类中添加更好的实现。提前感谢。
public class myCrypto
    {
        public static string MakeHash(string value)
        {
            return Convert.ToBase64String(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(value)));
        }

        public static bool CompareHash(string plainString, string hashString)
        {
            if (MakeHash(plainString)==hashString)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

1
你应该创建一个“盐哈希”来避免容易受到字典攻击的影响。 - Klaus Gütter
有盐哈希的任何示例吗? - John Doe
1个回答

3

更多关于哈希的信息,请查看这个答案:

目前最安全的单向加密算法是什么?

然而,绝不要存储用户密码。只存储经过盐处理的哈希值。如果这样做,即使哈希被黑客发现,对他们的利用也会受到限制。

如果这样做的话,您可以相对安全地将它们存储在安全的数据库中。确保遵循数据库的所有安全最佳实践。

还请参考:数据库中存储密码的最佳方法

请注意,您没有首先对密码进行盐处理。这是一个严重的安全漏洞,因为如果黑客发现了您的哈希算法并且可以访问您保存的哈希值,他可以将哈希值与预先散列的常见密码进行比较,以发现大部分用户的密码。

盐是添加到密码末尾的随机文本/二进制块。这应该对每个用户都不同,并与哈希一起存储。这样,即使两个人使用相同的密码,它们也会有不同的哈希,使黑客的生活更加困难。

这个答案讨论了在C#中为密码添加盐:如何在C#中进行哈希和盐处理密码。它没有解释盐是如何生成的。它应该是随机的,每个用户都不同,但不需要加密保护。System.Random可能已经足够了。


将盐值与哈希值一起存储不会破坏其目的吗? - FercoCQ
不行,因为每个人的盐值都不同。 - Yair Halberstadt
1
之前,他可以对最常用的一千个密码进行哈希处理,将它们与数据库中的数百万个密码进行比较,并查看哪些子集的用户使用这些密码。但现在,这样做只能针对一个用户工作,而此时这种方法已经不值得了。 - Yair Halberstadt
我曾认为盐的目的是将一个未知的文本引入“可能常见”的密码中,以便黑客无法对散列进行常见密码的检查。经过进一步阅读,我意识到它的目的就像你所说的那样,只是一种威慑力量,因为攻击整个密码列表需要额外的时间。我一直误解了盐的目的吗?还是在历史上它曾经是要保密的? - FercoCQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接