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

时间:2017-12-01 21:15:01

标签: python uuid

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

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

我注意到5th method of generating UUID's允许您提供字符串输入。

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

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

2 个答案:

答案 0 :(得分:2)

基于这个问题,我假设您对加密哈希函数了解不多。你从字符串中获得SHA1冲突的可能性非常低。目前,SHA1的已知冲突少于63个。

First ever SHA1 collision found

  

首先计算出SHA-1哈希冲突。所需要的只是五个聪明的大脑......以及6,610年的处理器时间

在加密领域,SHA1不再被认为是安全的,但肯定超出了您的预期。

加密散列函数被设计为one way functions。这意味着函数inverse是“难以”计算的。 (即知道输出绝不会帮助你确定输入)正如Blender在评论中指出的那样,这与碰撞的可能性无关。

查看Birthday Paradox以获取有关如何计算碰撞概率的一些基本信息。

This question解决了SHA1碰撞的可能问题。这article个州

  

如果发现冲突可以证明多项式时间可以从问题P中减少,则加密散列函数具有可证明的抵抗冲突攻击的安全性,问题P在多项式时间内应该是不可解的。然后,该函数被称为可证明安全的,或者只是可证明的。

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

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

这是一个基本的例子:

import sha3
k = sha3.keccak_512()
k.update(b"data")
k.hexdigest()
'1065aceeded3a5e4412e2187e919bffeadf815f5bd73d37fe00d384fe29f55f08462fdabe1007b993ce5b8119630e7db93101d9425d6e352e22ffe3dcb56b825'

答案 1 :(得分:1)

除了使用 pysha3(参见 DoesData 的回答),您还可以使用内置的 hashlib

import hashlib

h = hashlib.sha3_512() # Python 3.6+
h.update(b"Hello World")
h.hexdigest()

输出:

'3d58a719c6866b0214f96b0a67b37e51a91e233ce0be126a08f35fdf4c043c6126f40139bfbc338d44eb2a03de9f7bb8eff0ac260b3629811e389a5fbee8a894'