c# - 在 .net 核心 mvc 应用程序上存储用户密码的最佳方式

标签 c# asp.net-mvc

<分区>

请检查下面的类。我在这里做密码哈希然后比较这个密码哈希。现在我的问题是安全存储用户密码是最佳做法吗?请提出建议,您可以在我的类(class)中添加更好的实现。提前致谢

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;
            }
        }
    }

最佳答案

有关散列的更多信息,请查看此答案:

What is currently the most secure one-way encryption algorithm?

但是,在任何情况下都不要存储您的用户密码。只存储盐渍哈希。如果你这样做,即使黑客发现了哈希,它对他们的用处也有限。

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

另请查看:Best way to store password in database .

请注意,您并不是先对密码进行加盐处理。这是一个严重的安全漏洞,就好像黑客发现了您的散列算法并可以访问您保存的散列值,他可以简单地将散列值与预先散列的普通密码进行比较,从而发现您大部分用户的密码。

盐是在散列之前添加到密码末尾的一段随机文本/二进制 blob。这对于每个用户来说应该是不同的,并与哈希一起存储。这样一来,即使两个人使用相同的密码也会有不同的散列值,让黑客的日子难过得多。

这个答案讨论了在 C# 中加盐密码:Hash and salt passwords in C# .它没有解释盐是如何产生的。它应该是随机的,并且每个用户都不同,但不需要加密保护。 System.Random 可能会很好。

关于c# - 在 .net 核心 mvc 应用程序上存储用户密码的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53578182/

相关文章:

c# - 在语法上是否需要不同的打开和关闭定界符?

c# - 删除单个反斜杠,将字符串中的 double 转换为单精度数

javascript - 使用 AJAX 将 JavaScript 数组发送到 asp.net MVC Controller

asp.net-mvc - html.routelink 不去指定路由

asp.net-mvc - 如何检查浏览器是否启用cookie

c# - 使用 Bouncy CaSTLe AES/CBC/PKCS7 加密字符串

c# - ValueInjector Stack Overflow 映射实体与父实体

c# - 使用SqlConnection.Open里面使用(){} block ?

调用 MVC Controller 和操作方法的 HTML 按钮

c# - 模拟 GetExternalLoginInfoAsync() 方法