Asp.net 在SQL Server查询中比较网页的密码\u成员身份

Asp.net 在SQL Server查询中比较网页的密码\u成员身份,asp.net,sql,sql-server,asp.net-mvc-4,Asp.net,Sql,Sql Server,Asp.net Mvc 4,我有一个在ASP.NETMVC4中完成的web应用程序。它有用户,这些用户存储在SQL Server数据库中的表webpages\u UserProfile和webpages\u Membership等中 我有另一个应用程序,我需要做的是查询表webpages\u Membership,其中用户的密码是加密存储的,并将其与纯文本密码进行比较 所以我试着做一些类似的事情 选择* 从网页上下载 其中PwdCompare('mypasswordsend',Password)=1 但它不起作用。我知道

我有一个在ASP.NETMVC4中完成的web应用程序。它有用户,这些用户存储在SQL Server数据库中的表
webpages\u UserProfile
webpages\u Membership
等中

我有另一个应用程序,我需要做的是查询表
webpages\u Membership
,其中用户的密码是加密存储的,并将其与纯文本密码进行比较

所以我试着做一些类似的事情

选择*
从网页上下载
其中PwdCompare('mypasswordsend',Password)=1
但它不起作用。我知道这个栏目是一个
nvarchar(128)


我如何比较它呢?

让我们看看
PwdCompare
的第二个参数(我的重点):

密码散列
是密码的加密哈希。密码\u散列是*varbinary(128)*

因此,如果您的列以纯文本形式存储密码,或者存储二进制哈希的字符串表示,那么它将不起作用。您应该将该列更改为正确的,或者需要先将其转换,例如,检查以下脚本:

SELECT PWDENCRYPT(N'mypassword');
收益率:

0x0200D422C0365A196E308777C96CBEF3854818601DB516CADA98DBDF6A5F23922DC0FADD29B806121EA1A26AED86F57FCCB4DDF98F0EFBF44CA6BA864E9E58A818785FDDEDF

如果我们尝试将该值作为字符串进行比较,则得到0:

SELECT PWDCOMPARE(N'mypassword', N'0x0200D422C0365A196E308777C96CBEF3854818601DDB516CADA98DBDF6A5F23922DC0FADD29B806121EA1A26AED86F57FCCB4DDF98F0EFBF44CA6BA864E9E58A818785FDDEDF');
如果我们尝试将其作为varbinary值进行比较,则得到1:

SELECT PWDCOMPARE(N'mypassword', 0x0200D422C0365A196E308777C96CBEF3854818601DDB516CADA98DBDF6A5F23922DC0FADD29B806121EA1A26AED86F57FCCB4DDF98F0EFBF44CA6BA864E9E58A818785FDDEDF);
如果无法修复该表,则每次都可以在查询中执行此昂贵的显式转换(请注意,后面的
,1
非常重要):


我尝试获取散列并执行类似pwdcompare(“我的密码”、“超级散列jfsdgdjdng”)的操作,但没有成功too@MaximilianoPoggio那么,“超级哈希JFSDGIDFDJDNG”究竟是什么呢?这看起来根本不像一个散列,只是一个混乱的字符串。如果以纯文本形式存储密码,请停止使用
PWDCOMPARE
功能。如果要正确存储散列,请更改列数据类型并使用
PWDENCRYPT
存储数据(或使用您自己的散列/比较算法)。
SELECT PWDCOMPARE(N'mypassword', 
  CONVERT(VARBINARY(128), N'0x0200D422C0365A196E308777C96CBEF3854818601DDB516CADA98DBDF6A5F23922DC0FADD29B806121EA1A26AED86F57FCCB4DDF98F0EFBF44CA6BA864E9E58A818785FDDEDF'
  , 1));