sql-server - 在 MS SQL 中使用 HASHBYTES 比较哈希密码

标签 sql-server hash

我有一个简单的问题:

print HASHBYTES('SHA1', 'az09123')

给我:

0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3enter

我把它放在名为 OwnerEn 的 navchar 字段中

然后我试试这个:

SELECT * FROM AspNetUsers WHERE OwnerEn =  HASHBYTES('SHA1', 'az09123');

没有结果,它是空的

但这给了我结果:

SELECT * FROM AspNetUsers WHERE OwnerEn = '0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3';

第一条sql语句有什么问题?

最佳答案

正如 Oscar 在他的评论中提到的,您看不到任何结果,因为 nvarchar0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3 不同于二进制值 0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4./p>

理想情况下,您会将哈希值存储在适当的 binaryvarbinary 数据类型列中,但如果您绝对不能在数据库中更改它,则需要convert 您的 nvarchar 值到 binaryvarbinary(反之亦然),以便实际比较这两个值:

注意 convert 末尾的 1,以指定您要在开头包含 0x

nvarcharvarbinary:

convert(varbinary(max),'0xA00592FC3E531C5F7608110F73E8AE4B4F2EA4C3',1)

varbinarynvarchar:

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/

相关文章:

sql-server - PowerShell:使用 Get-Credential 调用 sqlcmd 不起作用

c# - 哈希表在调整大小时如何跟踪现有的键索引?

python - 将密码保存到 Django 数据库表之前的最佳哈希方法

ruby - 按日期将日志折叠成哈希数组

php - 有没有等同于 PHP 提取物的 Ruby?

java - 如何改进 HashMap 数组中的搜索

与原始查询相比,C# LINQ 查询创建低效的 SQL

sql - 在 SQL 中使用多个表进行全文搜索

php - 使用 PHP 搜索重复记录 : on Database using SQL, 或 file.txt?

sql - 如何通过 SQL 输出这个数字列表?