使用 uuid.uuid4() 或 Secrets.token_urlsafe() 来实现难以猜测的 url 并在 Postgresql 中快速选择?

use*_*978 8 python postgresql python-3.x

我通过以下方式生成“难以猜测”的 URL:

import uuid
url = uuid.uuid4()
Run Code Online (Sandbox Code Playgroud)

URL 存储在 Postgres 数据库中具有普通索引的字段中(用于快速搜索)。字段的数据类型是uuid: https://www.postgresql.org/docs/9.1/datatype-uuid.html

创建“难以猜测”URL 的另一种可能性是使用secrets模块并将其存储在某些 Postgres 字符串数据类型中:

import secrets
url = secrets.token_urlsafe()
Run Code Online (Sandbox Code Playgroud)

对于数据库中的快速搜索和随机生成的 url 的安全性,哪个更好?

谢谢

Ant*_*ala 1

不同的是secrets.token_urlsafe,没有质量保证uuid4secrets.token_urlsafe用于生成共享秘密。uuid4旨在生成可能的通用唯一标识符。

问题是您可能应该同时使用它们:秘密令牌您在数据库中查找的标识符:

create table foo (
    id uuid primary key,
    token text not null
);
Run Code Online (Sandbox Code Playgroud)

请注意, 的长度token_urlsafe应该随着时间的推移而变化,因此未来的 Python 版本可能会生成更长的字符串。

  • 谢谢...但这里有一些介绍:版本 4 UUID 本质上只是从加密安全随机数生成器中提取的 16 字节随机性,并通过一些位操作来识别 UUID 版本和变体 (https://stackoverflow.com/问题/703035/何时真正强制使用uuid作为设计的一部分/786541#786541)。对于难以猜测的 URL,UUID4 真的不安全吗?为什么?谢谢 (2认同)