如何对用户密码进行哈希处理?

时间:2019-02-14 11:18:21

标签: c# asp.net-mvc encryption

请不要将此标记为重复,因为我已经检查了多个帖子,但是没有一个帮助我。

Asp.net MVC - How to hash password

Hash and salt passwords in C#

我正在建立一个具有登录页面的网站,并且阅读了这篇文章

https://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right#normalhashing

有关如何确保我的登录名的安全性。

现在我了解到,每次注册时我都必须创建CSPRNG(加密安全的伪随机数生成器) 并将其添加到用户提交的密码中,然后对该混合进行哈希处理并将其存储在数据库中,并为每个用户存储盐,因为它是每个用户的随机盐。我的问题是最简单,最简单的方法是什么。

在我的控制器中,我通过这种方法获取用户名和密码

public JsonResult Login(LoginModel data)
{  
   //some code...
   //...
}

我的登录模型包含

public class LoginModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

所以我得到了用户名和密码,例如(字符串a = data.Username,...)

我已经将此添加到了项目中,但是我不知道如何从这里继续

using System.Security.Cryptography;

我肯定会知道如何保存在数据库中,如何制作随机盐(可能使用RNGCryptoServiceProvider)以及如何将其添加到用户密码中,然后对最终结果进行哈希处理。 感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

每个“如何安全地哈希密码” 问题的答案都是相同的:您不能。您从事的是制作独特网站的业务,而不是安全业务。您不知道自己在做什么,也不会知道自己在做错什么。直到您的数据库以一种或另一种方式泄漏出去,然后您为时已晚,对此做任何事情,都会损害用户的安全性。

您使用经过精心研究,经过严格保护,维护的代码来存储用户登录信息。使用ASP.NET MVC时,请使用ASP.NET Identity。你不要自己滚。期。

答案 1 :(得分:2)

您可以使用诸如此类的方法添加盐和对密码进行哈希处理。在这里,我们向方法发送一个字符串。使用登录部分创建用户时,基本上这就是实体框架哈希密码的方式。

    public static string EncodePassword(string password)
    {
        byte[] salt;
        byte[] buffer2;
        if (password == null)
        {
            throw new ArgumentNullException("password");
        }
        using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, 0x10, 0x3e8))
        {
            salt = bytes.Salt;
            buffer2 = bytes.GetBytes(0x20);
        }
        byte[] dst = new byte[0x31];
        Buffer.BlockCopy(salt, 0, dst, 1, 0x10);
        Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20);
        return Convert.ToBase64String(dst);
    }//Entity Framework default way 

以上用途 using System.Security.Cryptography;system.Buffer

答案 2 :(得分:-1)

我是这样做的,并且工作正常。

我添加了一个新班级

public class Helper
{

    public String CreateSalt(int size)
    {
        var rng = new RNGCryptoServiceProvider();
        var buff = new byte[size];
        rng.GetBytes(buff);
        return Convert.ToBase64String(buff);
    }
    public String GenerateSha256Hash(string input, string salt)
    {
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
        SHA256Managed shaString = new SHA256Managed();
        byte[] hash = shaString.ComputeHash(bytes);

        return BitConverter.ToString(hash);
    }

}

}

然后在我的控制器中添加了此类的实例

Helper myHelper = new Helper();

然后我将值传递给

string salt = myHelper.CreateSalt(5);
string hashedPassword = myHelper.GenerateSha256Hash(*PasswordField*, salt);
hashedPassword = hashedPassword.Replace("-", string.Empty).Substring(0, 16);

我要从哈希密码中删除“-”,然后使用前16个字符。

感谢@Luke Joshua Park,@ gusto2,@ JamesS和@CodeCaster的帮助。