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

标签 c# asp.net-mvc entity-framework hash

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

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

我允许密码在 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/

相关文章:

javascript - 将数字数组从 ajax 传递到 Controller

c# - 将 C# 位图转换为 Windows dib 句柄以用于 RIOT?

jquery - ASP.NET MVC 模式对话框/弹出窗口最佳实践

entity-framework - Entity Framework 4 : How expensive is it to create an EntityConnection?

c# - EF SqlQuery 尝试映射对象属性,即使它被归因于 [NotMapped]

c# - 如何在 C# 中映射双 C 结构指针?

c# - ORA-01790 与 EntityFramework

Asp.net MVC 3 Ajax.beginform提交-发送什么

c# - 如何在 ASP.NET MVC 中的 Controller 外部生成 URL?

c# - Entity Framework 播种导致插入语句与外键冲突