我有一个简单的问题:
print HASHBYTES('SHA1', 'az09123')
给我:
0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3enter
我把它放在名为 OwnerEn 的 navchar 字段中
然后我试试这个:
SELECT * FROM AspNetUsers WHERE OwnerEn = HASHBYTES('SHA1', 'az09123');
没有结果,它是空的
但这给了我结果:
SELECT * FROM AspNetUsers WHERE OwnerEn = '0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3';
第一条sql语句有什么问题?
最佳答案
正如 Oscar 在他的评论中提到的,您看不到任何结果,因为 理想情况下,您会将哈希值存储在适当的 注意 这在以下脚本中进行了演示: 输出:nvarchar
值 0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3
不同于二进制值 0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4
binary
或 varbinary
数据类型列中,但如果您绝对不能在数据库中更改它,则需要convert
您的 nvarchar
值到 binary
或 varbinary
(反之亦然),以便实际比较这两个值: convert
末尾的 1
,以指定您要在开头包含 0x
nvarchar
到 varbinary
:convert(varbinary(max),'0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3',1)
varbinary
到 nvarchar
:convert(nvarchar(100),hashbytes('SHA1', 'az09123'),1)
select hashbytes('SHA1', 'az09123') as BinaryHash
,convert(varbinary(max),'0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3',1) as NvarcharHash
,case when hashbytes('SHA1', 'az09123') = '0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3'
then 'Match'
else 'No Match'
end as UnconvertedMatchTest
,case when hashbytes('SHA1', 'az09123') = convert(varbinary(max),'0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3',1)
then 'Match'
else 'No Match'
end as ConvertedMatchTest
+--------------------------------------------+--------------------------------------------+----------------------+--------------------+
| BinaryHash | NvarcharHash | UnconvertedMatchTest | ConvertedMatchTest |
+--------------------------------------------+--------------------------------------------+----------------------+--------------------+
| 0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3 | 0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3 | No Match | Match |
+--------------------------------------------+--------------------------------------------+----------------------+--------------------+
关于sql-server - 在 MS SQL 中使用 HASHBYTES 比较哈希密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46885500/