让我们看看PwdCompare 的第二个参数(强调我的):
密码哈希
是密码的加密哈希。 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));