实用工具
UUID 与随机令牌
UUID v4、hex、base64 和 PIN——单个或成百上千。
122 比特:128 个随机比特减去 6 个用于版本和变体的比特。
什么是 UUID v4
UUID(universally unique identifier)——128 位标识符,用三十六个字符书写:八组,以连字符分隔,例如
3f2a9c1e-7b4d-4f6a-9e21-8c5d0b7a4e13。标准的第四版意味着其中几乎所有比特都是随机的。
128 个比特中有 6 个被保留:4 个比特用于版本号(第三组中始终是 4),2 个用于 RFC 4122 变体(第四组以 8, 9, a 或 b开头)。剩下 122 个随机比特——约为 5.3 × 10³⁶ 种组合。
UUID 的主要特性是:可以在任何地方生成,而无需与服务器协调。两个独立应用几乎不可能生成相同的标识符,因此适合在写入数据库之前于客户端生成 UUID。
UUID 与令牌的应用场景
- 当自增不适合或会暴露数据库规模时,用作表的主键;
- 用于日志和服务间追踪的请求标识符;
- 用于 API 重复请求的幂等键;
- 临时文件、文件夹和会话的名称;
- 用于密码重置链接和邀请的 hex 与 base64 令牌;
- 用于本地验证的 PIN 码——例如演示环境中。
UUID 与随机字符串有什么区别
随机字符串只是一组字符,没有任何约束。UUID 是标准:固定长度、规范写法、内含版本号和变体,各语言的库都提供现成支持。如果数值需要被标准解析器读取并存入 uuid列,请使用 UUID。
如果需要的正是令牌——用于链接、API 密钥或文件名——格式就更自由。Hex 的优点在于只由数字和拉丁字母 a–f 组成,无需转义。Base64 更紧凑:每字符 6 比特而非 4 比特,因此同等强度的字符串短四分之一。
令牌中有多少熵
令牌的熵按以下公式计算 长度 × log₂(字母表)。PIN 码的字符集是十个数字,因此即使 12 位也只有约 40 比特:这种码能防随机猜测,但防不住有针对性的穷举。
| 类型 | 计算 | 熵 |
|---|---|---|
| UUID v4 | 122 个随机比特 | 122 比特 |
| HEX,16 字节 | 16 × 8 | 128 比特 |
| HEX,32 字节 | 32 × 8 | 256 比特 |
| Base64,32 个字符 | 32 × 6 | 192 比特 |
| PIN,6 位数字 | 6 × log₂(10) | ≈ 20 比特 |
| 自定义字符串,32 个字符中取 24 个 | 24 × 5 | 120 比特 |
如何对待令牌
- 用于会话和 API 时——不少于 128 比特熵;
- 用于一次性链接时——短生命周期比长度更重要;
- 在服务器上保存令牌的哈希,而不是令牌本身;
- 不要把令牌写入日志和分析系统;
- PIN 仅用于本地验证,不用于访问数据。