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

问题描述 投票:1回答:3

我需要亲自动手,任何评论都将受到高度赞赏。

我有一个表用户,其字段为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字段具有相同的数据类型或者我错了吗?我是否必须对该值进行任何其他演员才能匹配?

提前致谢

sql sql-server database
3个回答
1
投票

将用户密码的数据类型向上扩展为VARCHAR(1000)或其他内容。哈希映射返回65个字符,因此它被截断为60。

编辑:这会解决它,但做丹所说的。这更加强大。


1
投票

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

HASHBYTES返回varbinary(8000)。将其用于数据库数据类型,以确保正确存储和比较值。


1
投票

字段UserPassword具有相同的数据类型?或者为了匹配而对值进行任何其他演员?

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

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

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

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

编辑:查看此Hashed password field and Length以获取更多信息

© www.soinside.com 2019 - 2024. All rights reserved.