我需要帮助,任何评论将不胜感激。
我有一个表 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字段具有相同的数据类型,还是我错了? 我必须对值进行其他强制转换才能匹配吗?
预先感谢
答案 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以获得更多信息