在 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 等功能
从 UUID 或 HMAC/JWT/hash 生成一次性安全令牌?