比较SQL Server查询中webpages_membership的密码

时间:2014-01-22 17:14:01

标签: asp.net sql sql-server asp.net-mvc-4

我在ASP.NET MVC 4中完成了一个Web应用程序。它有用户,存储在表webpages_UserProfilewebpages_Membership等SQL Server数据库中。

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

所以我尝试做类似

的事情
SELECT * 
FROM webpages_Membership 
 WHERE PwdCompare('mypasswordsend', Password) = 1

但它不起作用。我知道该列是nvarchar(128)

我该如何比较?

1 个答案:

答案 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));