将Python中的sha256摘要转换为UUID

6

给定Python中字符串的sha256哈希:

import hashlib

hash = hashlib.sha256('foobar'.encode('utf-8'))

如何将“哈希”转换为“UUID”?
注意:显然,在十六进制摘要(hexdigest)和 UUID 之间存在一对多的映射,因为十六进制摘要有2^256个可能的值,而UUID只有2^128个可能的值。
感谢您的考虑和回复。

你尝试使用过 https://docs.python.org/3/library/uuid.html 吗? - mkrieger1
@mkrieger1 UUID 库接受长度为 32 的十六进制字符串,而 sha256 hexdigest 的长度为 64。 - Ramón J Romero y Vigil
1
使用32个字符的哈希值(例如MD5)对该值进行哈希处理? - deceze
2个回答

8

考虑到 UUID 接受32个十六进制字符的输入字符串,而hexdigest 生成了64个字符,一个简单的方法是通过对生成的哈希摘要进行子索引来实现所需的字符串长度:

import hashlib
import uuid


hash = hashlib.sha256('foobar'.encode('utf-8'))

uuid.UUID(hash.hexdigest()[::2])

有没有理由选择每隔一个字符而不是切割前一半,即hash.hexdigest()[:16] - Garrett
1
@Garrett 我不这么认为,我主要是想尽量突出一半的长度。 - Ramón J Romero y Vigil

1

你可以先创建一个KDF哈希,这样你就可以选择哈希中所需的字节数来适配UUID。

import hashlib
import uuid

uuid.UUID(bytes=hashlib.pbkdf2_hmac('sha256', b'foobar', b'', 10**6, dklen=16))

如果这个解决方案对你有用,你应该确定一个16字节的KDF是否会影响你的安全要求。此外,你可能还想使用盐(pbkdf2_hmac的第三个参数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接