SQL Server 哈希字节种子

zim*_*mek 4 sql-server python hashing

我正在尝试将 SQL Server 生成的HASHBYTES()哈希值与 python hash()(或hashlib) 函数生成的哈希值进行比较。对于这两个函数,使用相同的算法。问题是我不知道 SQL 的种子,所以我无法使用 python 生成相同的输出。有没有办法设置SQL的种子?我无法找到任何与之相关的信息。

Joe*_*ish 5

我能够使用 MD5 算法在 python 和 T-SQL 代码之间获得相同的结果。例如,NO COLLUSION字符串0x5CA1A58C070F24EF1D4D2900E5727F37在两个平台上都散列到。

示例T-SQL 代码

SELECT HASHBYTES('MD5', 'NO COLLUSION');
Run Code Online (Sandbox Code Playgroud)

示例Python 代码

import hashlib
result = hashlib.md5(b'NO COLLUSION')
print(result.hexdigest())
Run Code Online (Sandbox Code Playgroud)

我不是加密专家,但我不清楚“SQL 的种子”是什么意思。MD5 算法似乎不要求实现者添加随机数。这样的算法会非常不方便,因为它会导致您现在遇到的相同问题:相同散列算法的不同实现会对相同输入产生不同结果。


Jos*_*ell 5

Joe 正确地指出 Pythonhashlib.md5和 SQL Server 的HASHBYTES('MD5', ...)函数具有相同的输出。

作为额外的说明,hash()Python 中的内置函数不打算以相同的方式使用。它的实现是特定于平台的,根据所使用的对象类型而有所不同,并且(如您所述)使用随机值进行腌制。

它不是 MD5 散列,并且试图让它与 生成的内容相匹配不会有太多运气HASHBYTES,因为它只是一个根本不同的东西。

这个随机盐值是在 Python 进程启动时生成的,因此即使在同一台机器上多次执行脚本,它通常也会有所不同。从文档

注意默认情况下, str 和 bytes 对象的 __hash__() 值是用不可预测的随机值“加盐”的。尽管它们在单个 Python 进程中保持不变,但它们在 Python 的重复调用之间是不可预测的。

这旨在提供保护,防止由精心选择的输入引起的拒绝服务,这些输入利用了 dict 插入的最坏情况性能,O(n^2) 复杂度。有关详细信息,请参阅http://www.ocert.org/advisories/ocert-2011-003.html