在Python中生成API令牌的UUID

11

我目前在Python中生成UUID的代码如下:

import uuid
import secrets

uuid.UUID(bytes=secrets.token_bytes(16))

这个能安全地用作 API 令牌或访问令牌吗?


使用UUID作为令牌的限制在于其只有128位空间。如果您可以接受这一点,那么您的代码就没问题了。当然,更长的密钥始终会更安全,特别是因为令牌越多,猜测它们就越容易。 - Klaus D.
1个回答

11

你目前的方法在某种程度上可以说是安全可靠的,原因如下:

  • 使用128位熵生成重复id的概率几乎为零。(这是您正在使用的标准UUID大小。)
  • secrets专门设计用于生成加密强度的随机数;token_bytes()实际上只是调用了os.urandom(),后者又从特定于操作系统的随机性来源返回随机字节。*

建议- uuid.uui4()基本上执行与此完全相同的操作,而不需要调用中间函数:

# https://github.com/python/cpython/blob/3.5/Lib/uuid.py
def uuid4():
    """Generate a random UUID."""
    return UUID(bytes=os.urandom(16), version=4)

无论如何,还有一个建议 - 您可以使用结果UUID对象的.hex来获取一个漂亮的非连字符字符串。
>>> uuid.uuid4().hex
'22c482ef3cd84c26bb49c0287828428f'

在Unix上,那就是/dev/urandom,它从诸如设备驱动程序之类的源收集信息。也就是说,这些信息是特定于生成机器的混乱信息,足够随机且不可识别主机计算机本身。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接