SQL 2012密码比较始终返回0

SQL 2012密码比较始终返回0,sql,sql-server,sql-server-2008,sql-server-2012,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 VA

想知道我是否可以在这里得到一些关于我的问题的帮助

表结构

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);
这一切与has存储的预期一样有效,而存储的密码使用散列加密

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

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

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


我该怎么做呢?

在第一个代码片段中,您将@HASH存储在UserHash列中。所以它保存了我怀疑你用做盐的东西(ABS(校验和(CRYPT_GEN_RANDOM(32)))

然后在下一个代码段中,在UserHash列中将@Hash设置为该值,然后使用PWDCOMPARE进行比较。因此,您在该函数中比较了错误的值


另外,声明散列应该是varbinary(128)

我认为你不应该使用PWDCOMPARE。您已经再次创建了散列,只需进行直接比较(就像您在WHERE子句的最后一个条件中所做的那样,您说的是'UserPass=@Pass'。PWDCOMPARE是冗余的,不能工作,因为它期望的是HASHBYTES的输出,可能期望它不被解析。一些类似的工作。