Python uuid.uuid4 对于密码重置链接是否足够强大?

Tes*_*son 11 python security uuid cryptography

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

def create_unique_code():
    return str(uuid.uuid4())
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ery 19

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


在判断生成安全随机令牌的某种方式(例如 UUID)是否“足够强大”时,您可能会关心两个因素:

  1. 是否有足够的可能值使其不被暴力破解?
  2. 使用密码的随机源是否安全

由于有2122第 4 版 UUID(略高于 5 万亿万亿),因此在这种情况下,第 1 点的答案肯定是“是”。所有可能的 UUID 的空间都不会很快被暴力破解。

上的官方 Python 文档uuid.uuid4()目前没有回答第 2 点,其中没有提及安全性或使用的随机性源是否强。事实上,整个文档uuid4()只是:

生成随机 UUID。

这显然没有提供安全保证。

UUID 规范也没有解决这个问题,该规范不强制要求在 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)
Run Code Online (Sandbox Code Playgroud)

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

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


Thi*_*ter 9

是的,UUID4 是完全随机的,并且足够长以排除蛮力或幸运猜测。因此,只要 RNGuuid.uuid4()提供足够好的随机性,您就应该没问题。

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

  • 也许还值得一提的是 python3.6 中新增的 [secrets](https://docs.python.org/3/library/secrets.html) 模块。 (4认同)