C# 如何散列用户密码?
请不要将此标记为重复,因为我已经检查了多个帖子,但都没有帮助我 我正在建立一个有登录页面的网站,我读了这篇文章 关于如何使我的登录安全 现在我明白了,在每次注册时,我都必须创建CSPRNGs(加密安全伪随机数生成器) 并将其添加到用户提交的密码中,然后散列此混合并将其存储在数据库中,并为每个用户存储salt,因为每个用户的salt是随机的。我的问题是什么是最简单和最简单的方法 在我的控制器中,我通过这个方法获取用户名和密码C# 如何散列用户密码?,c#,asp.net-mvc,encryption,C#,Asp.net Mvc,Encryption,请不要将此标记为重复,因为我已经检查了多个帖子,但都没有帮助我 我正在建立一个有登录页面的网站,我读了这篇文章 关于如何使我的登录安全 现在我明白了,在每次注册时,我都必须创建CSPRNGs(加密安全伪随机数生成器) 并将其添加到用户提交的密码中,然后散列此混合并将其存储在数据库中,并为每个用户存储salt,因为每个用户的salt是随机的。我的问题是什么是最简单和最简单的方法 在我的控制器中,我通过这个方法获取用户名和密码 public JsonResult Login(LoginMode
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;
我知道如何保存在数据库中,当然我只是想知道,如何创建随机salt(可能使用RNGCryptoServiceProvider),以及如何将其添加到用户的密码中,然后散列最终结果。
谢谢您的帮助。每个“如何安全地散列密码”问题的答案都是一样的:您不需要。你从事的是制作独特网站的业务,而不是安全业务。你不知道自己在做什么,也不会意识到自己做错了什么。直到你的数据库以这样或那样的方式泄露出去,然后你就来不及对此采取任何行动,从而危及你用户的安全
您使用经过充分研究、久经考验、维护的代码来存储用户登录。当您使用ASP.NET MVC时,您可以使用。你不会自己滚。句号 您可以使用这样的方法来添加盐并对密码进行哈希运算。在这里,我们向一个方法发送一个字符串。这基本上就是当您使用登录部分创建用户时实体框架散列如何作为密码的
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
上述用途
使用System.Security.Cryptography
和系统缓冲区
我是这样做的,它工作得很好
我添加了一个新类
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的帮助。你的.Net framework版本是什么?我觉得你链接到的第二篇文章中的blowdart回答了这一切,并提供了一个完整的例子(而且blowdart在安全性方面非常好;随着时间的推移,可能唯一改变的关键是加密算法的选择)(注意:
RNGCryptoServiceProvider
上的GetBytes
可以为您提供随机salt)@卡尔扎伊J25 4。5@MarcGravell我会再检查一遍。谢谢你的回复,但我想知道你为什么要使用缓冲区,有没有办法把盐放入一个字符串中,然后加上密码,哈希值也会作为一个字符串存储在db中。@riario我们的目的是使用慢盐哈希,有必要使用合理的迭代次数s以减缓暴力搜索。您也可以在internet上搜索PBKDF2、Argon2或brypt算法来存储密码(实际上RFC2898将PBKDF2定义为标准)@riario不要回避原始二进制数据。密码哈希本质上是原始二进制数据,而不是字符串。您应该这样对待它们。