这是我用来为我的应用生成密码重置链接的代码:
def create_unique_code():
return str(uuid.uuid4())
这够强吗?我使用了一到两天的到期时间。
答案 0 :(得分:3)
是的,UUID4是完全随机的,足以排除暴力强迫或幸运猜测。因此,只要RNG uuid.uuid4()
提供足够好的随机性,你应该没问题。
但是,请考虑使用例如加密签名的令牌(itsdangerous
lib可以处理它) - 您不仅可以在生成它时指定到期时间,还不一定要在服务器上存储有关令牌的任何内容
答案 1 :(得分:1)
在CPython中,是的。可能在其他Python实现中,但是您可能要仔细检查一下,使用加密强度高的随机性源来生成UUID。
在判断某种生成安全随机令牌的方法(例如UUID)是否“足够强”时,您可能需要考虑两个因素:
由于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
返回:
大小为 个随机字节的字符串,适合加密用途。