使用 HASHBYTES 函数对数据进行哈希处理

using HASHBYTES function to hash data

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

散列的

我只有一个输入和输出的例子,我需要找出SQL服务器中的散列逻辑。

这是原来的号码:02229747 这是哈希值:4ad54f5b376038f49a44d411e6d551ae4c8dd147c8605a7eec32ba850080b326

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

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

Hashbytes 可以采用多种不同的算法作为输入。尝试每一个:

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 列 returns 您要查找的值,因此使用的算法是 SHA2_256。 请注意,我将数据作为 string (varchar),而不是 integer (bigint)。.将 022529747 表示为 varchar 的字节与将 022529747 表示为 bigint 的字节非常不同。

背景:

散列和加密不同。

SHA 代表“安全哈希算法”。它需要一些输入,并产生一个输出散列。如果输入改变,散列改变(以birthday problem. But you can't go backwards. You can't take the output hash, and turn it back into the input data. The best you can do is try every different possible input, and see if that input generates the hash. See this 3Blue1Brown video for an illustrative explanation.

为限

SHA 是加密哈希函数系列,但不要被这个名字骗了。 “加密”与“加密”的含义不同。这只是意味着“很难根据输出猜测”输入数据可能是什么,因为输出看起来是随机的。请参阅 This thread 了解散列函数和加密散列函数之间的区别

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

SQL hashbytes 函数可以使用多种不同的算法,但 none 其中的算法是可逆的。都是哈希算法,不是加密算法。

如果您需要在代码中加密和解密,正确的SQL功能是EncryptByKey and DecryptByKey