ASP.NET MVC/C#-Linq和哈希密码
我正在尝试创建身份验证,其中所有密码都是散列和盐析的。首先,为了简单起见,我尝试了不加盐,以下是我的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
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
中,然后根据现有哈希值检查是否相等,这样做行不通吗?我已经有一段时间没有使用哈希了,这就是为什么我认为史蒂文·罗宾斯更完整、更正确、更详细^^