如何使用使用哈希加密、C#、ASP.NET MVC、实体框架的存储过程验证帐户

如何使用使用哈希加密、C#、ASP.NET MVC、实体框架的存储过程验证帐户,c#,sql-server,asp.net-mvc,C#,Sql Server,Asp.net Mvc,所以基本上我有一个存储过程,可以解密密码,如果用户存在,返回1。代码如下: CREATE PROCEDURE [dbo].[ValidateAccount] @Username VARCHAR(50), @AccountPwd VARCHAR(100) AS BEGIN SET NOCOUNT ON; DECLARE @Salt CHAR(25); DECLARE @PwdWithSalt VARCHAR(125);

所以基本上我有一个存储过程,可以解密密码,如果用户存在,返回1。代码如下:

CREATE PROCEDURE [dbo].[ValidateAccount]    
     @Username VARCHAR(50),
     @AccountPwd VARCHAR(100)   
AS 
BEGIN      
    SET NOCOUNT ON;

    DECLARE @Salt CHAR(25);   
    DECLARE @PwdWithSalt VARCHAR(125);  
    DECLARE @PwdHash VARBINARY(20);  

    SELECT @Salt = Salt, @PwdHash = [Pass]   
    FROM dbo.Users 
    WHERE Username = @Username;

    SET @PwdWithSalt = @Salt + @AccountPwd;

    IF (HASHBYTES('SHA1', @PwdWithSalt) = @PwdHash)
        RETURN 1;   
    ELSE
        RETURN 0;
END;
并有一个登录名:

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
    <div class="form-group">
    <i class="fa fa-user"></i>
    <!-- I'm using htmlAtributes to add CSS class styles and HTML atributes on Editor controls-->
    @Html.EditorFor(model => model.Username , new { htmlAttributes = new { @class = "form-control", @required = "true", @placeholder = "Username" } })
    </div>
    <div class="form-group">
        <i class="fa fa-lock"></i>                   
        @Html.TextBoxFor(model => model.Pass , new { data_bind = "value: Password", @class = "form-control", @required = "true", @placeholder = "Password", @type = "password" })
    </div>
    <div class="form-group">
        <input type="submit" class="btn btn-primary btn-block btn-lg" value="Login">
    </div>
    }
正如您所看到的,数据库中的“Pass”列是
Byte[]
,因此我在执行过程和验证用户是否存在以及采取诸如转到仪表板之类的操作时遇到问题

有什么想法吗?我没能找到一个切实可行的解决办法

这是主控制器,我应该在这里进行验证:

[HttpPost]
public ActionResult Index(Warehouse_APP.Models.Users userMod)
{
    return View();
}

实际上,您得到的是一个存储过程,它使用与输入原始密码时相同的盐对用户输入的密码进行散列。如果这两个匹配,则返回值为1,否则返回值为0

因此,在MVC控制器的HTTP_POST方法中,您只需要使用绑定模型中的用户名和密码调用该存储过程,并根据结果重定向到相应的成功/错误页面


您可能会使用entity framework,下面是如何执行该SQL:

只是为了澄清:您的存储过程不会解密密码(另外:它是散列的,不是加密的,并且散列不能反转)。它所做的是对传入的明文输入进行散列,然后比较散列值和salt值是否匹配您是否将未经散列的密码传递给RDBMS?你不应该,这是一个安全风险,直到它本身。
[HttpPost]
public ActionResult Index(Warehouse_APP.Models.Users userMod)
{
    return View();
}