在Python中为API令牌生成UUID

Jor*_*lva 7 python secret-key

我目前正在Python中生成UUID,如下所示:

import uuid
import secrets

uuid.UUID(bytes=secrets.token_bytes(16))
Run Code Online (Sandbox Code Playgroud)

这可以安全地用作API令牌或访问令牌吗?

Bra*_*mon 8

您目前的方法可以说是安全可靠的两个原因:

  • 生成具有 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)
Run Code Online (Sandbox Code Playgroud)

无论如何,另一个建议 - 您可以使用.hex生成的 UUID 对象来获得一个不错的非连字符字符串。

>>> uuid.uuid4().hex
'22c482ef3cd84c26bb49c0287828428f'
Run Code Online (Sandbox Code Playgroud)

*在 Unix 上/dev/urandom,它从设备驱动程序等来源收集信息。即特定于生成机器但足够随机且无法识别主机本身的乱码信息。