为什么使用SHA2_256的SQL查询在WHERE子句中返回NULL

时间:2018-07-05 21:05:26

标签: sql sql-server database

我需要帮助,任何评论将不胜感激。

我有一个表 Users 和一个字段 UserPassword ,数据类型为 varchar(60)

我将选中的用户插入表格

SELECT HASHBYTES('SHA2_256','test') 
it insert its value (0x9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08)

到目前为止一切顺利

当我想从表中检索用户并且与字段UserPassword的值不匹配时,就会出现问题。

Select u.UserName
from Users u
where UserPassword  = HASHBYTES('SHA2_256','test')

以0个结果执行查询。为什么???

UserPassword字段具有相同的数据类型,还是我错了? 我必须对值进行其他强制转换才能匹配吗?

预先感谢

3 个答案:

答案 0 :(得分:1)

  

我有一个表Users,其字段UserPassword的数据类型为varchar(60)

HASHBYTES返回varbinary(8000)。使用该值作为您的数据库数据类型,以确保正确存储和比较该值。

答案 1 :(得分:1)

将用户密码的数据类型上调至VARCHAR(1000)或类似的值。哈希映射返回65个字符,因此被截断为60个字符。

编辑:这可以解决问题,但请Dan代替。那更健壮。

答案 2 :(得分:1)

字段UserPassword具有相同的数据类型?是否对该值进行其他强制转换以匹配?

这取决于您使用的哈希算法。不管输入如何,散列总是产生相同长度的结果。通常用一系列十六进制数字表示文本中的二进制哈希结果。或者,您可以使用UNHEX()函数将十六进制数字的字符串减少一半。

  

SHA-256生成256位哈希值。您可以使用CHAR(64)或   BINARY(32)

NIST建议使用SHA-256或更高版本的密码。较小的散列算法有其用途,但它们可能是易破解的。

在应用散列功能之前,您应该保护密码。这样,密码不会影响哈希结果的长度。

编辑:选中此Hashed password field and Length以获得更多信息