在 Python 中为 API 令牌生成 UUID

Posted

技术标签:

【中文标题】在 Python 中为 API 令牌生成 UUID【英文标题】:Generating UUID for API tokens in Python 【发布时间】:2019-04-01 21:35:51 【问题描述】:

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

import uuid
import secrets

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

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

【问题讨论】:

作为令牌的 UUID 有 128 位空间的限制。如果您可以忍受,那么您的代码就可以了。当然,更长的密钥总是更安全。特别是因为令牌越有效越容易猜测。 【参考方案1】:

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

生成具有 128 位熵的重复 id 的概率为effectively nil。 (这是您正在使用的标准 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,它从设备驱动程序等来源收集信息。 IE。生成机器特有但足够随机且无法识别主机本身的乱码信息。

【讨论】:

以上是关于在 Python 中为 API 令牌生成 UUID的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.4 中为某些路由禁用 csrf 令牌?不工作[重复]

如何在 API 网关中为请求/响应映射添加速度模板中生成随机 UUID 等功能

如何在 ajax 标头中为每个用户发送 api 令牌?

从 UUID 或 HMAC/JWT/hash 生成一次性安全令牌?

在javascript和axios中为来自前端的每个api调用发送firebase身份验证令牌

使用 JwT 令牌身份验证对 HTTP Rest API 的 Python 发布请求会生成重复的帖子