sql-server - 使用 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
解决方案
哈希字节可以采用多种不同的算法作为输入。试一试:
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 功能是EncryptByKey和DecryptByKey
推荐阅读
- json - 如何使用 JSON 文件中的 Angular 7 中的插值来提供 SVG 图标?
- android - 从异步调用填充的 Flutter 列表会引发应用内错误,但不会崩溃
- ssl-certificate - macOS Mojave 升级后 Marklogic WebDav 服务器连接不工作
- python - sounddevice 多输入输出通道接线
- maven - 从命令行运行单个 TestNG 测试类的故障排除
- python - 如何遍历数据框并仅遍历唯一值?
- pygame - 你如何解决:pygame中的“TypeError:'Mob'对象不可下标”?
- linux - 命名信号量的 sem_open 失败,因为我的进程无法在 /dev/shm 中创建相关文件
- javascript - 服务器正在尝试将 HTML 表中的中继器控件转换为 HtmlTableRow
- typescript - 谷歌云函数错误“加载用户代码时函数失败。” 带有打字稿功能