【问题标题】:Is Python uuid.uuid4 strong enough for password reset links?Python uuid.uuid4 对于密码重置链接是否足够强大?
【发布时间】:2017-05-21 04:49:53
【问题描述】:

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

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

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

【问题讨论】:

  • 没关系,至少在 cPython 上 uuid4 是加密安全的。避免将这些唯一代码存储在数据库中的一个好方法是在代码本身中对 user_id 进行编码。一个很好的例子是 Django 是如何实现它的:docs.djangoproject.com/en/4.0/topics/signing

标签: python security cryptography uuid


【解决方案1】:

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


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

  1. 是否有足够的可能值使其不被暴力破解?
  2. 是否使用了随机源cryptographically secure

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

official Python docs on uuid.uuid4() 目前没有回答第 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 返回:

一串大小个适合加密使用的随机字节。

【讨论】:

  • 附带说明,但这是否意味着 os.urandom 可以阻止? AFAIK 任何保证适用于加密目的的东西都有可能在某个时候被阻塞
  • @Cruncher,检查答案中的 urandom 链接,它似乎可以阻止。
【解决方案2】:

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

但是,请考虑使用例如一个加密签名的令牌(itsdangerous lib 可以处理它)——你不仅可以在生成它时指定一个到期时间,你也不必在你的服务器上存储任何关于令牌的东西。

【讨论】:

  • 也许还值得一提python3.6中的secrets模块。
猜你喜欢
  • 2013-05-23
  • 1970-01-01
  • 2012-10-05
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多