Python uuid.uuid4是否足够强大的pw重置链接?

时间:2017-01-06 12:11:30

标签: python security cryptography uuid

这是我用来为我的应用生成密码重置链接的代码:

def create_unique_code():
    return str(uuid.uuid4())

这够强吗?我使用了一到两天的到期时间。

2 个答案:

答案 0 :(得分:3)

是的,UUID4是完全随机的,足以排除暴力强迫或幸运猜测。因此,只要RNG uuid.uuid4()提供足够好的随机性,你应该没问题。

但是,请考虑使用例如加密签名的令牌(itsdangerous lib可以处理它) - 您不仅可以在生成它时指定到期时间,还不一定要在服务器上存储有关令牌的任何内容

答案 1 :(得分:1)

在CPython中,是的。可能在其他Python实现中,但是您可能要仔细检查一下,使用加密强度高的随机性源来生成UUID。


在判断某种生成安全随机令牌的方法(例如UUID)是否“足够强”时,您可能需要考虑两个因素:

  1. 是否有足够的价值使其不会被强行使用?
  2. 是否使用了cryptographically secure的随机源?

由于there are 2122 version 4 UUIDs(略超过5万亿亿亿亿美元),在这种情况下,对点1的回答肯定是“是”。所有可能的UUID的空间都不会在短期内变得无法强制使用。

official Python docs当前未回答第2点,它没有提及安全性或所使用的随机源是否强。实际上,uuid4()的整个文档就是:

  

生成随机UUID。

显然没有提供安全保证。

UUID specification也未解决该问题,它没有强制要求在UUID生成中使用密码学上强大的随机性源,并且确实明确地考虑了“可预测的随机数源” 安全注意事项部分中用于生成UUID。

但是,我们可以在https://github.com/python/cpython/blob/master/Lib/uuid.py处查看实现:

def uuid4():
    """Generate a random UUID."""
    return UUID(bytes=os.urandom(16), version=4)

由于它使用os.urandom作为其随机性来源,因此是安全的。请参阅https://docs.python.org/3/library/os.html#os.urandom上的文档,其中注意到os.urandom返回:

  

大小为 个随机字节的字符串,适合加密用途。