生成唯一哈希的最安全方法?

Bre*_*bel 3 python uuid

我需要生成可以在文件名中使用的唯一标识符,并且可以在给定相同的输入值的情况下进行复制。我需要生成数百万个这样的标识符,因为源输入有数百万种组合。

为简单起见,我将在示例中使用一个小的集合,但实际的集合可能会相当大(数百,也许数千个项目);大于可以手动编码为文件名。

我注意到生成 UUID 的第 5 种方法允许您提供字符串输入。

> input_set = {'apple', 'banana', 'orange'}
> uuid.uuid5(uuid.NAMESPACE_URL, pickle.dumps(input_set)).hex
'f39926529ad45997984643816c1bc403'
Run Code Online (Sandbox Code Playgroud)

文档说它SHA1在幕后使用。碰撞风险是否太高?有没有更好的方法来可靠地散列唯一标识符?

Tho*_*ler 8

您还可以使用内置模块,而不是使用pysha3(请参阅DoesDatahashlib的答案) :

import hashlib

h = hashlib.sha3_512() # Python 3.6+
h.update(b"Hello World")
h.hexdigest()
Run Code Online (Sandbox Code Playgroud)

输出:

'3d58a719c6866b0214f96b0a67b37e51a91e233ce0be126a08f35fdf4c043c6126f40139bfbc338d44eb2a03de9f7bb8eff0ac260b3629811e389a5fbee8a894'
Run Code Online (Sandbox Code Playgroud)


Doe*_*ata 6

从字符串中获得 SHA1 冲突的几率低得惊人。目前,SHA1 的已知冲突少于 63 个。

首次发现 SHA1 冲突

第一次计算 SHA-1 哈希冲突。只需要五个聪明的大脑……和 6,610 年的处理器时间

SHA1 在密码学世界中不再被认为是安全的,但在这里肯定超出了您的期望。

加密散列函数被设计为单向函数。这意味着逆函数“难以”计算。(即,知道输出绝不会帮助您确定输入)正如 Blender 在评论中指出的那样,这与发生碰撞的机会无关。

查看生日悖论,了解有关如何计算碰撞概率的一些基本信息。

这个问题解决了 SHA1 冲突的可能原因。这篇文章指出

如果发现冲突可以证明是多项式时间可从问题 P 减少的,则密码散列函数具有可证明的针对冲突攻击的安全性,而问题 P 应该在多项式时间内无法解决。然后将该函数称为可证明安全的,或者只是可证明的。

是“安全”哈希算法的列表。

更新 您在评论中指出您的输入远大于 SHA1 的 160 位限制。我建议您在这种情况下使用 SHA3,因为输入的大小没有限制。查看 Python文档以获取更多信息。

这是一个基本示例:

import sha3
k = sha3.keccak_512()
k.update(b"data")
k.hexdigest()
'1065aceeded3a5e4412e2187e919bffeadf815f5bd73d37fe00d384fe29f55f08462fdabe1007b993ce5b8119630e7db93101d9425d6e352e22ffe3dcb56b825'
Run Code Online (Sandbox Code Playgroud)

  • 无论是否存在单向函数,任何哈希函数都保证存在冲突。 (2认同)