SQL 2012密码比较始终返回0

时间:2014-08-21 14:22:49

标签: sql sql-server sql-server-2008 sql-server-2012

想知道我是否可以通过查询获得一些帮助。

表格结构

UserID    BigInt    Primary   Auto
UserName  VarChar(64)
UserPass  VarChar(Max)
UserHash  VarChar(Max)

插入用户

SET @HASH = ABS(CHECKSUM(CRYPT_GEN_RANDOM(32)));
SET @PW = 0x0200 + @HASH + HASHBYTES('SHA2_512', CAST(@UP AS VARBINARY(MAX)) + @HASH);

Insert Into [MY].[USERS_TABLE]
(UserName, UserPass, UserHash)
Values
(@UN, @PW, @HASH);

这一切都按预期运行已存储,密码存储用哈希加密

我的问题源于选择用户a.k.a. a Login

Declare @Hash   VarBinary(Max);
Declare @Pass   VarBinary(Max)
Set @Hash = (Select userHash From MY.USERS_TABLE Where UserName = @UN);
SET @Pass = 0x0200 + @Hash + HASHBYTES('SHA2_512', CAST(@UP AS VARBINARY(MAX)) + @Hash);

Select userID, PWDCOMPARE(@UP, @Hash) As PWCompared
From MY.USERS_TABLE
Where UserName = @UN
AND
UserPass = @Pass;

现在,这确实有效,但是,我宁愿使用PWDCOMPARE函数而不是针对UserPass列检查@Pass,但它总是返回0

是的,我确信我传递给它的信息是正确的:)

我该怎么做?

1 个答案:

答案 0 :(得分:2)

在第一个片段中,您将@HASH存储在UserHash列中。因此,我认为你使用的东西是我怀疑的(ABS(CHECKSUM(CRYPT_GEN_RANDOM(32)))。

然后在下一个片段中,将@Hash设置为UserHash列中的该值,然后使用PWDCOMPARE进行比较。所以你要比较那个函数中的错误值。

此外,PWDCOMPARE documentation表示散列应该是varbinary(128)。