我需要实现一些私有数据的确定性随机化。即我们有一些原始的UUID,然后我们使用它的md5
哈希为一个RNG播种并生成一个新的UUID:
input hashlib, uuid, random
# seed RNG
hex_seed = hashlib.md5(original_uuid.encode()).hexdigext()
seed = int(hex_seed, 16)
random.seed(seed)
# generate new UUID
val = random.getrandbits(128)
new_uuid = str(uuid.UUID(int=val))
原始值不仅可以是UUID,还可以是用户名或其他数据,以及结果值,因此md5
哈希值。但最重要的是UUID。
现在的问题是:攻击者在给定UUID的情况下计算原始UUID值有多难?
可以使用彩虹表反转MD5。但是很难反转Python的内置RNG来确定128个生成字节的种子值吗?我试着自己找到它但是卡住了一下。
到目前为止,我发现getrandbits(128)
导致4次调用genrand_int32
,而seed()
调出导致init_by_array
调用4个32位整数数组
参考文献: 1. Python的RNG源代码(在C中):https://hg.python.org/cpython/file/2.7/Modules/_randommodule.c#l231