【发布时间】:2017-02-09 15:50:44
【问题描述】:
如何将用户输入(密码)散列到数据库,然后在登录期间读取散列密码?
我相信解决方案是在注册时对密码进行哈希处理,密码在数据库中保存为哈希值。稍后登录时,它应该取消哈希并将其密码与用户密码输入进行比较。 但我不知道该怎么做。
我允许密码有nvarchar(MAX)in db,因为散列密码通常很长。
[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);
}
我先使用数据库。
【问题讨论】:
-
您不加密密码。你散列它们。
-
@StephenMuecke 谢谢!我修好了。
-
您为什么不使用开箱即用的 Identity?如果您想手动完成所有这些操作,请参考this blog
-
您为什么两次发布相同的问题?你看过这里的答案吗? stackoverflow.com/questions/39802862/mvc-how-to-hash-and-salt
-
仅使用散列函数是不够的,仅添加盐对提高安全性无济于事。相反,iIterate over an HMAC with a random salt for about 100ms duration and save the salt with the hash.使用
PBKDF2、password_hash、Bcrypt等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。
标签: c# asp.net-mvc entity-framework hash