zim*_*mek 4 sql-server python hashing
我正在尝试将 SQL Server 生成的HASHBYTES()
哈希值与 python hash()
(或hashlib
) 函数生成的哈希值进行比较。对于这两个函数,使用相同的算法。问题是我不知道 SQL 的种子,所以我无法使用 python 生成相同的输出。有没有办法设置SQL的种子?我无法找到任何与之相关的信息。
我能够使用 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 算法似乎不要求实现者添加随机数。这样的算法会非常不方便,因为它会导致您现在遇到的相同问题:相同散列算法的不同实现会对相同输入产生不同结果。
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。