请不要将此标记为重复,因为我已经检查了多个帖子,但是没有一个帮助我。
Asp.net MVC - How to hash password
我正在建立一个具有登录页面的网站,并且阅读了这篇文章
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)以及如何将其添加到用户密码中,然后对最终结果进行哈希处理。 感谢您的帮助。
答案 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的帮助。