在SQL Server中获取密码时出错

时间:2018-03-28 17:46:16

标签: sql sql-server

我有一个名为USER的表和一个名为UserPassword varchar(100)的列。

如果我查询user表:

SELECT UserPassword 
FROM "USER"

它返回

0x9F19488027B745FA80E2C27F3DCDCD5D7845AA74B12AB26882F617D0517F73B8

如果我查询值:

SELECT HASHBYTES('SHA2_256', '13149066');

它返回

0x9F19488027B745FA80E2C27F3DCDCD5D7845AA74B12AB26882F617D0517F73B8

此时两个结果都匹配且具有相同的数据类型。

但是当我试图匹配它们时,我没有得到任何结果。

SELECT "Name" 
FROM "USER" 
WHERE UserPassword = HASHBYTES('SHA2_256', '13149066');

返回:

0 records found

我也试过了:

SELECT "Name" 
FROM "USER" 
WHERE UserPassword = HASHBYTES('SHA2_256', CAST('13149066' AS varchar(100)));

返回:

0 records found.

此查询有什么问题?

2 个答案:

答案 0 :(得分:6)

这些记录不一样。 HASHBYTES返回VARBINARY类型。

你可以在这里看到:

select binary_checksum(CAST('0x9F19488027B745FA80E2C27F3DCDCD5D7845AA74B12AB26882F617D0517F73B8' AS VARCHAR(8000)))

SELECT binary_checksum(HASHBYTES('SHA2_256', '13149066'))

varchar vs varbinary不匹配。您需要将它们转换为相同的类型或更改用户表上的数据类型,以将pw哈希存储为varbinary(8000)。

https://docs.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql

答案 1 :(得分:0)

谢谢dfundako。 你的答案很有帮助

我只是将密码字段的数据类型更改为int,我执行了此操作

SELECT "Name" from "USER" 
where UserPassword = binary_checksum(HASHBYTES('SHA2_256', '13149066'))

我得到了渴望的结果。