生成唯一哈希的最安全方法?
Safest way to generate a unique hash?
我需要生成可用于文件名并可在给定相同输入值的情况下重现的唯一标识符。我需要生成数百万个这样的标识符,因为源输入有数百万个组合。
为了简单起见,我将在示例中使用一个小集合,但实际集合可能会相当大(数百,甚至数千项);大于可以手动编码为文件名。
我注意到 5th method of generating UUID's 允许您提供字符串输入。
> input_set = {'apple', 'banana', 'orange'}
> uuid.uuid5(uuid.NAMESPACE_URL, pickle.dumps(input_set)).hex
'f39926529ad45997984643816c1bc403'
文档说它在后台使用 SHA1
。碰撞风险是否过高?有没有更好的方法来可靠地散列唯一标识符?
字符串发生 SHA1 冲突的几率低得惊人。目前已知的 SHA1 冲突少于 63 次。
First ever SHA1 collision found
First ever' SHA-1 hash collision calculated. All it took were five clever brains... and 6,610 years of processor time
SHA1 在密码学世界中不再被认为是安全的,但在这里肯定超出您的预期。
加密哈希函数被设计为 one way functions。这意味着函数逆函数“难以”计算。 (即知道输出绝不会帮助您确定输入)正如 Blender 在评论中指出的那样,这与碰撞的可能性无关。
查看 Birthday Paradox 了解有关如何计算碰撞概率的一些基本信息。
This question addresses the likely hood of a SHA1 collision. This article 州
A cryptographic hash function has provable security against collision attacks if finding collisions is provably polynomial-time reducible from problem P which is supposed to be unsolvable in polynomial time. The function is then called provably secure, or just provable.
Here 是“安全”哈希算法的列表。
更新
您在评论中指出您的输入远远大于 SHA1 的 160 位限制。我建议您在这种情况下使用 SHA3,因为您的输入大小没有限制。查看 Python documentation 了解更多信息。
这是一个基本示例:
import sha3
k = sha3.keccak_512()
k.update(b"data")
k.hexdigest()
'1065aceeded3a5e4412e2187e919bffeadf815f5bd73d37fe00d384fe29f55f08462fdabe1007b993ce5b8119630e7db93101d9425d6e352e22ffe3dcb56b825'
而不是使用pysha3
(see 's answer), you could also use the built-in hashlib
:
import hashlib
h = hashlib.sha3_512() # Python 3.6+
h.update(b"Hello World")
h.hexdigest()
输出:
'3d58a719c6866b0214f96b0a67b37e51a91e233ce0be126a08f35fdf4c043c6126f40139bfbc338d44eb2a03de9f7bb8eff0ac260b3629811e389a5fbee8a894'
我需要生成可用于文件名并可在给定相同输入值的情况下重现的唯一标识符。我需要生成数百万个这样的标识符,因为源输入有数百万个组合。
为了简单起见,我将在示例中使用一个小集合,但实际集合可能会相当大(数百,甚至数千项);大于可以手动编码为文件名。
我注意到 5th method of generating UUID's 允许您提供字符串输入。
> input_set = {'apple', 'banana', 'orange'}
> uuid.uuid5(uuid.NAMESPACE_URL, pickle.dumps(input_set)).hex
'f39926529ad45997984643816c1bc403'
文档说它在后台使用 SHA1
。碰撞风险是否过高?有没有更好的方法来可靠地散列唯一标识符?
字符串发生 SHA1 冲突的几率低得惊人。目前已知的 SHA1 冲突少于 63 次。
First ever SHA1 collision found
First ever' SHA-1 hash collision calculated. All it took were five clever brains... and 6,610 years of processor time
SHA1 在密码学世界中不再被认为是安全的,但在这里肯定超出您的预期。
加密哈希函数被设计为 one way functions。这意味着函数逆函数“难以”计算。 (即知道输出绝不会帮助您确定输入)正如 Blender 在评论中指出的那样,这与碰撞的可能性无关。
查看 Birthday Paradox 了解有关如何计算碰撞概率的一些基本信息。
This question addresses the likely hood of a SHA1 collision. This article 州
A cryptographic hash function has provable security against collision attacks if finding collisions is provably polynomial-time reducible from problem P which is supposed to be unsolvable in polynomial time. The function is then called provably secure, or just provable.
Here 是“安全”哈希算法的列表。
更新 您在评论中指出您的输入远远大于 SHA1 的 160 位限制。我建议您在这种情况下使用 SHA3,因为您的输入大小没有限制。查看 Python documentation 了解更多信息。
这是一个基本示例:
import sha3
k = sha3.keccak_512()
k.update(b"data")
k.hexdigest()
'1065aceeded3a5e4412e2187e919bffeadf815f5bd73d37fe00d384fe29f55f08462fdabe1007b993ce5b8119630e7db93101d9425d6e352e22ffe3dcb56b825'
而不是使用pysha3
(see hashlib
:
import hashlib
h = hashlib.sha3_512() # Python 3.6+
h.update(b"Hello World")
h.hexdigest()
输出:
'3d58a719c6866b0214f96b0a67b37e51a91e233ce0be126a08f35fdf4c043c6126f40139bfbc338d44eb2a03de9f7bb8eff0ac260b3629811e389a5fbee8a894'