首页 > 解决方案 > 使用 HASHBYTES 函数对数据进行哈希处理

问题描述

我有需要散列的数据。我有要比较散列数字的数字列表。据有人告诉我,数据是用 SHA_256 散列的

我只有一个输入和输出示例,我需要找出 SQL Server 中的哈希逻辑。

这是原始数字:02229747 这是哈希数:4ad54f5b376038f49a44d411e6d551ae4c8dd147c8605a7eec32ba850080b326

我尝试使用以下方法,但无法获得相同的结果。

declare @number bigint = 022529747  
DECLARE @HashId varbinary(50) =  HashBytes('SHA2_256', cast(@number as varbinary(50)))
select @HashId

标签: sql-serverhashsha256

解决方案


哈希字节可以采用多种不同的算法作为输入。试一试:

select 
a = hashbytes('MD2', '022529747'),
b = hashbytes('MD4', '022529747'),
c = hashbytes('MD5', '022529747'),
d = hashbytes('SHA', '022529747'),
e = hashbytes('SHA1', '022529747'),
f = hashbytes('SHA2_256', '022529747'),
g = hashbytes('SHA2_512', '022529747')

f 列返回您要查找的值,因此使用的算法是 SHA2_256。请注意,我将数据作为字符串(varchar)而不是整数(bigint)放入。. 将 022529747 表示为 varchar 的字节与将 022529747 表示为 bigint 的字节非常不同。

背景:

散列和加密是不同的。

SHA 代表“安全散列算法”。它需要一些输入,并产生一个输出哈希。如果输入发生变化,哈希会发生变化(有生日问题的限制。但你不能倒退。你不能把输出的哈希变成输入数据。你能做的最好的就是尝试每个不同的可能输入,并查看该输入是否生成哈希。请参阅此3Blue1Brown 视频以获取说明性说明

SHA 是一系列加密散列函数,但不要让这个名字欺骗了你。“加密”与“加密”的含义不同。这只是意味着“很难猜测”输入数据可能基于输出是什么,因为输出看起来是随机的。有关散列函数和加密散列函数之间的区别,请参见此线程

AES 代表“高级加密标准”。这是一种对称密钥加密。使用 AES 加密的数据可以解密回原始输入。“对称”部分意味着一个密钥用于加密和解密(与例如 PGP 加密相比,它使用不同的密钥来加密和解密)。

SQL hashbytes 函数可以使用许多不同的算法,但没有一个是可逆的。它们都是散列算法,而不是加密算法。

如果您需要在代码中加密和解密,正确使用的 SQL 功能是EncryptByKeyDecryptByKey


推荐阅读