我在ASP.NET MVC 4中完成了一个Web应用程序。它有用户,存储在表webpages_UserProfile
和webpages_Membership
等SQL Server数据库中。
我有另一个应用程序,我需要做的是查询表webpages_Membership
,其中用户的密码是加密存储的,并将它们与纯文本密码进行比较。
所以我尝试做类似
的事情SELECT *
FROM webpages_Membership
WHERE PwdCompare('mypasswordsend', Password) = 1
但它不起作用。我知道该列是nvarchar(128)
。
我该如何比较?
答案 0 :(得分:1)
让我们看看PwdCompare
的第二个论点(强调我的):
password_hash
是密码的加密哈希值。 password_hash是 * varbinary(128) * 。
因此,如果您的列以纯文本格式存储密码,或者存储二进制哈希的字符串表示形式,那么它将不起作用。您应该将列更改为正确,或者您需要先将其转换,例如检查这个脚本:
SELECT PWDENCRYPT(N'mypassword');
收率:
0x0200D422C0365A196E308777C96CBEF3854818601DDB516CADA98DBDF6A5F23922DC0FADD29B806121EA1A26AED86F57FCCB4DDF98F0EFBF44CA6BA864E9E58A818785FDDEDF
如果我们尝试将该值作为字符串进行比较,我们得到0:
SELECT PWDCOMPARE(N'mypassword', N'0x0200D422C0365A196E308777C96CBEF3854818601DDB516CADA98DBDF6A5F23922DC0FADD29B806121EA1A26AED86F57FCCB4DDF98F0EFBF44CA6BA864E9E58A818785FDDEDF');
如果我们尝试将作为varbinary值进行比较,我们得到1:
SELECT PWDCOMPARE(N'mypassword', 0x0200D422C0365A196E308777C96CBEF3854818601DDB516CADA98DBDF6A5F23922DC0FADD29B806121EA1A26AED86F57FCCB4DDF98F0EFBF44CA6BA864E9E58A818785FDDEDF);
如果您无法修复该表,那么您每次都可以在查询中执行这种昂贵的显式转换(请注意尾随,1
很重要):
SELECT PWDCOMPARE(N'mypassword',
CONVERT(VARBINARY(128), N'0x0200D422C0365A196E308777C96CBEF3854818601DDB516CADA98DBDF6A5F23922DC0FADD29B806121EA1A26AED86F57FCCB4DDF98F0EFBF44CA6BA864E9E58A818785FDDEDF'
, 1));