UUID、随机密钥与 Hex 怎么选

三种结果看起来都很随机,但设计目标不同。先判断你需要的是“唯一标识”“不可猜测的凭据”,还是“与指定命令兼容的字节表示”。

主题:安全与随机最后核对:2026-07-24
类型典型用途不要用于
UUID v4数据库记录 ID、请求追踪 ID、客户端临时标识密码、API 密钥、访问令牌
32 位随机密钥测试凭据、临时令牌、需要字母数字格式的随机值协议明确要求固定字节数或特定编码时擅自替代
32 字节 Hex需要 openssl rand -hex 32 兼容输出的配置误认为 64 个字符就是 64 字节

UUID v4 的重点是唯一性

UUID v4 固定为 36 个显示字符,其中包含 32 个十六进制字符和 4 个连字符。部分位用于版本和变体标记,并非所有位都可自由随机。它的巨大取值空间让随机碰撞极不可能,适合分布式生成标识,但格式公开且通常会出现在日志或 URL 中,不应被当作秘密。

随机密钥的重点是不可预测

用于认证的随机值必须由密码学安全随机数产生。本站两个随机工具使用浏览器 Web Crypto,而不是 Math.random()。如果协议规定了熵、长度和字符集,应以协议为准;例如“32 个字母数字字符”和“32 个随机字节”并不等价。

长度换算示例openssl rand -hex 32 先产生 32 字节随机数据,再用两个十六进制字符表示每个字节,因此输出长度是 64 个字符,总随机量为 256 bit。

选择顺序

  1. 接口只需要公开唯一 ID:选择 UUID v4。
  2. 接口明确要求 openssl rand -hex 32:选择 64 位 Hex。
  3. 接口要求固定 32 位字母数字值:选择 32 位密钥生成器。
  4. 接口有专门密钥生成规范:严格执行规范,不自行替换。

常见问题

UUID 冲突是否完全不可能?

不是数学意义上的零概率,但正确随机生成时概率极低。关键业务仍应保留数据库唯一约束。

随机值生成后可以发到聊天工具吗?

如果它会用于真实认证,不建议通过非授权渠道传播。生成只是第一步,存储、传输、轮换同样重要。