在.net core mvc应用程序上存储用户密码的最佳方法[重复]

Posted

技术标签:

【中文标题】在.net core mvc应用程序上存储用户密码的最佳方法[重复]【英文标题】:best way to store user password on .net core mvc application [duplicate] 【发布时间】:2019-05-03 19:52:16 【问题描述】:

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

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;
            
        
    

【问题讨论】:

你应该创建一个“salted hash”以避免受到字典攻击 加盐哈希的任何例子? 【参考方案1】:

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

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 可能会很好。

【讨论】:

将盐与哈希一起存储不会破坏其目的吗? 不,因为盐因人而异。 以前他可以对一千个最常见的密码进行哈希处理,将它们与数据库中的数百万个密码进行比较,然后查看哪些用户子集使用这些密码,现在这样做只对一个用户有效在那个时候,它不再值得了 我认为 salt 的目的是在 可能是常见的密码中引入未知文本,这样黑客就不能只对常见密码进行哈希处理来检查哈希值。进一步阅读后,我意识到它的目的就是你所说的,只是一种威慑,因为攻击整个密码列表需要额外的时间。我总是误解盐的用途吗?或者它在历史的某个时刻是要保密的?

以上是关于在.net core mvc应用程序上存储用户密码的最佳方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 17. 基于Claim和Policy的授权 上

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

如何在 ASP.NET Core MVC 中使用依赖注入设计存储库模式?

如何在 .Net Core MVC 中发布

从 ASP.net Core 2 MVC 应用程序中的 appSettings.json 存储/检索 ConnectionString

ASP.NET Core Identity - 扩展密码哈希