Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC/C#-Linq和哈希密码_C#_Linq_Md5 - Fatal编程技术网

ASP.NET MVC/C#-Linq和哈希密码

ASP.NET MVC/C#-Linq和哈希密码,c#,linq,md5,C#,Linq,Md5,我正在尝试创建身份验证,其中所有密码都是散列和盐析的。首先,为了简单起见,我尝试了不加盐,以下是我的linq: var CurrentUser = db.Users .Single(u => u.UserName == form["username"] && u.Password.SequenceEqual ( MD5.Create().ComputeHash

我正在尝试创建身份验证,其中所有密码都是散列和盐析的。首先,为了简单起见,我尝试了不加盐,以下是我的linq:

var CurrentUser = db.Users
    .Single(u => u.UserName == form["username"] && u.Password.SequenceEqual
               (
                   MD5.Create().ComputeHash
                       (
                           Encoding.UTF8.GetBytes(form["password"])
                       )
               )
          );
不幸的是,出现了以下错误:


不支持查询运算符“SequenceEqual”。

LINQ不允许在其lambda表达式中使用各种函数/运算符。有时会很烦人。我建议找到一种方法,在变量中存储要检查的内容,然后只检查

... && u.Password = myVariable);

LINQ不允许在其lambda表达式中使用每种函数/运算符。有时会很烦人。我建议找到一种方法,在变量中存储要检查的内容,然后只检查

... && u.Password = myVariable);

这将有助于了解您从何处获取用户记录(即什么是“db.Users”)

您使用的任何linq提供程序(EF等)都可能不支持在查询中使用SequenceEqual,因此您需要获取用户记录,然后检查密码:

var currentUser = db.Users.Single(u => u.UserName == form["username"]);
var hash = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(form["password"]));

var passwordCorrect = currentUser.Password.SequenceEqual(hash);
您可能还希望在“u.UserName==”比较中更加明确,以明确它是否不区分大小写/序号等


编辑:Flater的回答也可以,但就个人而言,我宁愿将记录拉回来并验证它,因为您可能想知道用户是否确实存在(不仅仅是用户名和密码是否正确),这样您就可以“锁定”帐户或使用其他帐户(更有用)根据多次不正确的密码尝试执行操作。

这将有助于了解您从何处获取用户记录(即什么是“db.Users”)

您使用的任何linq提供程序(EF等)都可能不支持在查询中使用SequenceEqual,因此您需要获取用户记录,然后检查密码:

var currentUser = db.Users.Single(u => u.UserName == form["username"]);
var hash = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(form["password"]));

var passwordCorrect = currentUser.Password.SequenceEqual(hash);
您可能还希望在“u.UserName==”比较中更加明确,以明确它是否不区分大小写/序号等


编辑:Flater的回答也可以,但就个人而言,我宁愿将记录拉回来并验证它,因为您可能想知道用户是否确实存在(不仅仅是用户名和密码是否正确),这样您就可以“锁定”帐户或使用其他帐户(更有用)基于多次错误密码尝试的操作。

为什么不按用户名获取用户,然后将其密码与salt进行比较?有点

var CurrentUser = db.Users
    .FirstOrDefault(u => u.UserName == form["username"]); 
if (CurrentUser == null || !CurrentUser.Password.SequenceEqual(
                   MD5.Create().ComputeHash(
                           Encoding.UTF8.GetBytes(form["password"])))) { ...user of password is incorrect.. }

为什么不按用户名获取用户,然后将其密码与salt进行比较?有点

var CurrentUser = db.Users
    .FirstOrDefault(u => u.UserName == form["username"]); 
if (CurrentUser == null || !CurrentUser.Password.SequenceEqual(
                   MD5.Create().ComputeHash(
                           Encoding.UTF8.GetBytes(form["password"])))) { ...user of password is incorrect.. }

我以前从未对哈希值做过太多的工作,谢谢你的信任;)你会得到比我更详细的投票:)我以前从未用过太多的哈希,谢谢你的信任;)你会得到一个比我更详细的投票:)这可能有效,但通常密码不仅是散列的,而且是盐渍的,所以比较对它们不起作用。更好的选择是向客户机获取哈希和salt,并在那里进行所有计算。我的建议是进行计算,然后检查是否相等。通过预先计算用户输入的哈希值,将其存储在
myVariable
中,然后根据现有哈希值检查是否相等,这样做行不通吗?我已经有一段时间没有使用哈希了,这就是为什么我认为史蒂文·罗宾斯更加完整、正确和详细^^^^^^^^^^^^这可能有用,但是通常密码不仅是哈希的,而且是盐的,所以比较对他们不起作用。更好的选择是向客户机获取哈希和salt,并在那里进行所有计算。我的建议是进行计算,然后检查是否相等。通过预先计算用户输入的哈希值,将其存储在
myVariable
中,然后根据现有哈希值检查是否相等,这样做行不通吗?我已经有一段时间没有使用哈希了,这就是为什么我认为史蒂文·罗宾斯更完整、更正确、更详细^^