如何将用户输入(密码)散列到数据库,然后在登录期间读取散列密码?
我认为解决方案是在注册时对密码进行哈希处理,密码在数据库中以哈希形式保存。稍后登录后,它应该取消散列并将其密码与用户输入的密码进行比较。 但我不知道该怎么做。
我允许密码在 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/