生成唯一哈希的最安全方法?
Posted
技术标签:
【中文标题】生成唯一哈希的最安全方法?【英文标题】:Safest way to generate a unique hash? 【发布时间】:2018-05-16 01:02:07 【问题描述】:我需要生成可以在文件名中使用的唯一标识符,并且可以在给定相同输入值的情况下重现。我需要生成数百万个这样的标识符,因为源输入有数百万个组合。
为简单起见,我将在示例中使用一个小集合,但实际集合可能相当大(数百甚至数千个项目);大于可以手动编码为文件名的大小。
我注意到5th method of generating UUID's 允许您提供字符串输入。
> input_set = 'apple', 'banana', 'orange'
> uuid.uuid5(uuid.NAMESPACE_URL, pickle.dumps(input_set)).hex
'f39926529ad45997984643816c1bc403'
文档说它在后台使用SHA1
。发生碰撞的风险是否太高?有没有更好的方法来可靠地散列唯一标识符?
【问题讨论】:
这是一个解决 UUID 冲突问题的资源:@987654322@ 感谢@blurp,尽管它只处理生成 UUID 的版本 1 和 2。我正在寻找使用从输入字符串和命名空间标识符生成它们的版本 5。 ***文章专门讨论了与版本 3、4 和 5 发生冲突的可能性。 谢谢@blurp,看来概率很小;不过,我会留下这个问题,因为我仍然有兴趣看看是否有更好、更规范的方法来做到这一点。 您的输入值有哪些示例?如果唯一性完全由输入值决定,有什么理由不能使用输入值本身? 【参考方案1】:字符串发生 SHA1 冲突的几率非常低。目前,SHA1 的已知冲突少于 63 个。
First ever SHA1 collision found
第一次计算出 SHA-1 哈希冲突。只需要五个聪明的大脑......和 6,610 年的处理器时间
SHA1 在加密世界中不再被认为是安全的,但在这里肯定超出了您的期望。
加密散列函数设计为one way functions。这意味着逆函数“难以”计算。 (即知道输出决不能帮助您确定输入)正如 Blender 在 cmets 中指出的那样,这与碰撞的可能性无关。
查看Birthday Paradox,了解有关如何计算碰撞概率的一些基本信息。
This question 解决了可能的 SHA1 冲突问题。这个article 状态
如果发现冲突可证明是多项式时间可从问题 P 中约简,则密码散列函数具有可证明的安全性以防止冲突攻击,而问题 P 应该在多项式时间内无法解决。然后将该函数称为可证明安全的,或者只是可证明的。
Here 是“安全”哈希算法的列表。
更新 您在 cmets 中声明您的输入远大于 SHA1 的 160 位限制。我建议您在这种情况下使用 SHA3,因为输入的大小没有限制。查看 Python documentation 了解更多信息。
这是一个基本的例子:
import sha3
k = sha3.keccak_512()
k.update(b"data")
k.hexdigest()
'1065aceeded3a5e4412e2187e919bffeadf815f5bd73d37fe00d384fe29f55f08462fdabe1007b993ce5b8119630e7db93101d9425d6e352e22ffe3dcb56b825'
【讨论】:
谢谢。虽然我想指出我没有使用文件名作为源输入,但我使用的是非常大的字符串;比 160 位 SHA1 或 128 位 UUID 字符串大得多。 无论是否存在单向函数,都保证任何哈希函数都存在冲突。 如果名称长于可能考虑使用不同的哈希算法。有些可以处理任意长度的字符串。 @BrendanAbel:SHA-1 的 输出 是 160 位。每个哈希函数都有一个固定长度的输出,这就是它们有用的原因。它们可以获取任意数量的数据并从中派生出固定长度的散列。【参考方案2】:您也可以使用内置的hashlib
,而不是使用pysha3
(请参阅DoesData 的答案):
import hashlib
h = hashlib.sha3_512() # Python 3.6+
h.update(b"Hello World")
h.hexdigest()
输出:
'3d58a719c6866b0214f96b0a67b37e51a91e233ce0be126a08f35fdf4c043c6126f40139bfbc338d44eb2a03de9f7bb8eff0ac260b3629811e389a5fbee8a894'
【讨论】:
以上是关于生成唯一哈希的最安全方法?的主要内容,如果未能解决你的问题,请参考以下文章