【问题标题】:Insert into DB fails while encrypting the password in asp.net mvc在 asp.net mvc 中加密密码时插入数据库失败
【发布时间】:2015-10-23 17:21:43
【问题描述】:

我正在使用 ASP.Net mvc 开发应用程序。我有一个注册表单。当用户输入密码时,我想加密密码并存储在数据库中。当我加密密码时我的代码失败并且尝试将其插入数据库。请查看我的代码,如果有错误请告诉我。

在插入期间,我遇到了错误: “值不能为空。参数名称:输入” 我的控制器是:

  using CTCFremont.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;

namespace CTCFremont.Controllers
{
    public class UserLoginController : Controller
    {
        private CTCFremontEntities db = new CTCFremontEntities();

        //
        // GET: /UserLogin/Create

        public ActionResult Index()
        {

            return View();
        }

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

        //
        // POST: /UserLogin/Create

        [HttpPost]
        public ActionResult Create(UserLogin userlogin)
        {
            if (ModelState.IsValid)
            {
                userlogin.Pass = Crypto.SHA256(userlogin.Pass);
                db.UserLogins.Add(userlogin);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(userlogin);
        }



        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}

我的看法是:

@model CTCFremont.Models.UserLogin

@{
    ViewBag.Title = "SignUp";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<script src="https://code.jquery.com/jquery-2.1.4.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<h2>Sign Up!</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset >
        <legend>Submit your details </legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.UserName)
        </div>
        <div class="editor-field" >
            @Html.EditorFor(model => model.UserName)
            @Html.ValidationMessageFor(model => model.UserName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Email)
        </div>
        <div class="editor-field" >
            @Html.EditorFor(model => model.Email)
            @Html.ValidationMessageFor(model => model.Email)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Pass)
        </div>
        <div class="editor-field" >
            @Html.EditorFor(model => model.Pass, new { id = "Password" })
            @Html.ValidationMessageFor(model => model.Pass)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Confirm)
        </div>
        <div class="editor-field" >
            @Html.EditorFor(model => model.Confirm, new { id = "Confirmation" })
            @Html.ValidationMessageFor(model => model.Confirm)
        </div>

        <p>
            <input type="submit" value="Submit" />
        </p>
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

【问题讨论】:

  • 您是否收到任何错误消息要与我们分享?
  • 谢谢史蒂夫。我更新了我的帖子
  • 您的表 userlogin 是否仅包含三列?如果您使用 INSERT 而不指定列名,那么您应该为所有列传递值。
  • 你读过msdn.microsoft.com/en-us/library/…关于那个SHA1类的内容吗?
  • 我想指出,SHA-1 不是安全密码哈希。 SHA-2 和 SHA-3 也不是。见How to securely hash passwords?

标签: c# asp.net asp.net-mvc-4 encryption


【解决方案1】:

您的 SQL 字符串参数周围缺少单引号,需要一个字符串格式化程序,并且需要使用 ExecuteSqlCommand 而不是 SqlQuery。这应该可以。

db.UserLogins.ExecuteSqlCommand(
  string.Format("insert into Userlogin values('{0}','{1}','{2}')",
    userlogin.UserName, userlogin.Email, EncodedPassowrd));

【讨论】:

  • 嘿托德,我已经查询了数据库,我看到我的表有我插入的值。但是索引方法有问题。密码没有被编码。我是创建方法做错了吗? public ActionResult Create(UserLogin userlogin) { if (ModelState.IsValid) { db.UserLogins.Add(userlogin); db.SaveChanges(); return RedirectToAction("索引"); } 返回视图(用户登录); }.. 创建操作中包含的这段代码是否有问题
  • 您可能想要使用 SHA-256,因为 SHA-1 不久前被打败了。这里的答案有实现细节:stackoverflow.com/questions/212510/… - 只需忽略注册表部分。您想要单向哈希结果。
  • @ToddSprang SHA-2 在用作密码哈希时几乎与 SHA-1 一样糟糕。它的计算成本很低,而且没有盐。请改用 PBKDF2、bcrypt、scrypt 或 Argon。
  • 天哪,你说得对,我刚刚写了一个 PBKDF2 密码哈希。不知道我在想什么。 en.wikipedia.org/wiki/PBKDF2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多