gpt4 book ai didi

c# - MVC - 如何哈希和加盐

转载 作者:行者123 更新时间:2023-12-02 08:07:27 25 4
gpt4 key购买 nike

我设法使哈希工作,但盐部分仍然是一个问题..我一直在搜索和测试示例但没有成功。这是我的哈希代码:

        [Required]
[StringLength(MAX, MinimumLength = 3, ErrorMessage = "min 3, max 50 letters")]
public string Password { get; set; }
public string Salt { get; set; }

哈希密码函数(无盐):

 public string HashPass(string password) { 

byte[] encodedPassword = new UTF8Encoding().GetBytes(password);
byte[] hash = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(encodedPassword);
string encoded = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower();

return encoded;//returns hashed version of password
}

注册:

        [HttpPost]
public ActionResult Register(User user) {
if (ModelState.IsValid) {

var u = new User {
UserName = user.UserName,
Password = HashPass(user.Password)//calling hash-method
};

db.Users.Add(u);
db.SaveChanges();

return RedirectToAction("Login");
}
}return View();
}

登录:

     public ActionResult Login() {
return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(User u) {
if (ModelState.IsValid)
{
using (UserEntities db = new UserEntities()) {

string readHash = HashPass(u.Password);

var v = db.Users.Where(a => a.UserName.Equals(u.UserName) &&
a.Password.Equals(readHash)).FirstOrDefault();
if (v != null) {

return RedirectToAction("Index", "Home"); //after login
}
}
}return View(u);
}

到目前为止哈希工作......但是我如何让盐在这里工作?

我更喜欢对我的代码进行演示,因为我发现用文字很难理解。

我首先使用数据库。

最佳答案

在安全方面,不要尝试重新发明轮子。使用Claims基于身份验证。

如果您仍然必须管理用户名和密码,请使用基于哈希的消息身份验证代码 ( HMAC )

我还建议您花一些时间进行投资并阅读 Enterprise Security Best Practices 。已经有更聪明的人解决了这个问题,为什么要重新发明轮子呢? .NET 拥有所有这些优点。

示例如下:

//--------------------MyHmac.cs-------------------
public static class MyHmac
{
private const int SaltSize = 32;

public static byte[] GenerateSalt()
{
using (var rng = new RNGCryptoServiceProvider())
{
var randomNumber = new byte[SaltSize];

rng.GetBytes(randomNumber);

return randomNumber;

}
}

public static byte[] ComputeHMAC_SHA256(byte[] data, byte[] salt)
{
using (var hmac = new HMACSHA256(salt))
{
return hmac.ComputeHash(data);
}
}
}



//-------------------Program.cs---------------------------
string orgMsg = "Original Message";
string otherMsg = "Other Message";


Console.WriteLine("HMAC SHA256 Demo in .NET");

Console.WriteLine("----------------------");
Console.WriteLine();

var salt = MyHmac.GenerateSalt();

var hmac1 = MyHmac.ComputeHMAC_SHA256(Encoding.UTF8.GetBytes(orgMsg), salt);
var hmac2 = MyHmac.ComputeHMAC_SHA256(Encoding.UTF8.GetBytes(otherMsg), salt);


Console.WriteLine("Original Message Hash:{0}", Convert.ToBase64String(hmac1));
Console.WriteLine("Other Message Hash:{0}", Convert.ToBase64String(hmac1));

注意:盐不必保密,可以与哈希本身一起存储。这是为了提高 rainbow table 的安全性攻击。

关于c# - MVC - 如何哈希和加盐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39802862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com