gpt4 book ai didi

c# - Asp.net MVC - 如何散列密码

转载 作者:太空狗 更新时间:2023-10-29 22:07:07 26 4
gpt4 key购买 nike

如何将用户输入(密码)散列到数据库,然后在登录期间读取散列密码?

我认为解决方案是在注册时对密码进行哈希处理,密码在数据库中以哈希形式保存。稍后登录后,它应该取消散列并将其密码与用户输入的密码进行比较。但我不知道该怎么做。

我允许密码在 db 中有 nvarchar(MAX),因为散列密码通常很长。

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

注册:

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

var u = new User {
UserName = user.UserName,
Password = user.Password
};

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()) {

//un-hash password?

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

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

我首先使用数据库。

最佳答案

您永远不需要解散密码。 cryptographic hash function应该是单向操作。

(这正是它被称为散列而不是加密的原因。如果散列密码是您操作流程中的一个正常过程,那么它就不会是散列和取消散列,它将是加密和解密。因此,散列与加密是不同的,正是因为不应该发生取消散列。)

哈希提供了安全性,因为没有人可以窃取您的用户密码,即使他们设法查看了您的数据库的内容。

  • 当用户注册时,计算其密码的哈希值,将哈希值存储在数据库中,永远忘记密码。

  • 当用户登录时,计算他们输入的密码的哈希值(也忘记了该密码,)并查看该哈希值是否与存储在数据库中的哈希值匹配。

这是大多数网站使用的机制,这就是为什么如果您成功完成“我忘记了密码”程序,他们仍然不会显示您的密码的原因:他们不拥有它;他们即使想找也找不回来。相反,他们会向您发送密码重置链接。

至于如何从字符串计算散列,interwebz 上有很多关于该问题的答案,例如:MD5 (MSDN) ; SHA-256 (MSDN) ; SHA-512 (MSDN)

关于c# - Asp.net MVC - 如何散列密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39802164/

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