Sql server 在MS SQL中使用哈希字节比较哈希密码

Sql server 在MS SQL中使用哈希字节比较哈希密码,sql-server,hash,Sql Server,Hash,我有一个简单的问题: print HASHBYTES('SHA1', 'az09123') 给我: 0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3enter 我把它放在名为OwnerEn的navchar字段中 然后我试试这个: SELECT * FROM AspNetUsers WHERE OwnerEn = HASHBYTES('SHA1', 'az09123'); 没有结果,它是空的 但这给了我一个结果: SELECT * FROM AspNet

我有一个简单的问题:

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
与二进制值
0xA00592FC3E531C5F7608110F73AE4B4F2EA4C3
不同

理想情况下,您可以将哈希值存储在适当的
binary
varbinary
数据类型列中,但如果您绝对无法在数据库中更改哈希值,则需要
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              |
+--------------------------------------------+--------------------------------------------+----------------------+--------------------+
试试这个,它很管用

DECLARE @AspNetUsers TABLE (OwnerEn VARCHAR(50))

INSERT INTO @AspNetUsers VALUES ('0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3')


SELECT *
FROM   @AspNetUsers
WHERE  OwnerEn  = master.dbo.Fn_varbintohexstr(HASHBYTES('SHA1', 'az09123'))
输出:


可能是因为函数HASHBYTES返回varbinary,但您的列类型是varchar?您正在比较不同的数据类型,应该注意,如果如标题所示,这是专门针对密码的,那么与良好的密码哈希相比,这里有一些错误——特别是缺少salt和哈希算法的选择。