
什么是随机令牌生成器?
随机令牌生成器 创建不可预测、高熵的字符串,用作现代软件系统中的标识符。与人类选择的密码不同,令牌由机器生成,旨在满足严格的安全要求:它们必须在所有实例中唯一,长度足够以抵抗猜测,并且统计随机,使得一个令牌的部分信息不会泄露另一个令牌的任何信息。
令牌驱动着认证网络通信的几乎每个方面。当你登录网站时,服务器会生成一个会话令牌并存储在cookie中。当开发者集成第三方API时,供应商会颁发一个API密钥——即令牌。当网页表单防御跨站请求伪造(CSRF)时,它会嵌入一个隐藏令牌,服务器在处理提交前进行验证。

为什么不直接使用密码或UUID?
密码设计为人类可记忆,因此它们短且遵循可预测的模式。相比之下,令牌可以是64或128个字符的纯随机字符串。UUID(版本4)是随机的,但只有122位熵,并且带有连字符格式化——适合作为标识符,但不适合作为暴露在头部或URL中的秘密令牌。
专用令牌生成器让你精确控制长度、字符集和熵预算。
常见令牌使用场景
- API密钥 — 认证第三方服务,无需暴露用户密码。通常32–64个字符,常带前缀(例如
sk_live_...)以便识别。 - 会话令牌 — 跨HTTP请求跟踪已认证用户。OWASP建议至少128位(22+ base64url字符)。
- CSRF令牌 — 嵌入表单以防止跨站请求伪造。每个会话必须唯一,并在服务器端验证。
- 密码重置链接 — 通过电子邮件发送的一次性URL。应在15–60分钟内过期。
- Webhook密钥 — 在服务之间签名和验证负载。GitHub、Stripe和Slack都使用HMAC签名和共享密钥令牌。
- 邀请码 — 短随机令牌,允许一次性访问资源。
- Nonce — “一次性数字”,用于防止OAuth和加密协议中的重放攻击。
- 双因素备份码 — 用户存储的紧急代码,以防丢失认证设备。

这个工具如何生成令牌?
此令牌生成器使用浏览器内置的 Web Crypto API(crypto.getRandomValues())——与专业安全库使用的标准相同。这些值来自操作系统的熵池(硬件事件、时序抖动等),因此是加密安全的。
你可以配置:
- 长度 — 从8到512个字符
- 字符集 — 大写字母(A–Z)、小写字母(a–z)、数字(0–9)和符号(!@#$%^&*)
- 输出格式 — 纯文本、十六进制、base64或base64url
令牌应该多长?
| 使用场景 | 最小长度 | 推荐字符集 |
|---|---|---|
| CSRF令牌 | 32字符 | 字母数字 |
| API密钥 | 32字符 | 字母数字 + 符号 |
| 会话ID | 64字符 | 十六进制或base64url |
| 密码重置 | 64字符 | 十六进制或base64url |
| Webhook密钥 | 32字符 | 字母数字 |
熵的公式:E = log₂(N^L),其中N是可能字符数,L是长度。一个32字符的字母数字令牌具有log₂(62³²) ≈ 190位熵——远超任何暴力破解能力。

令牌安全最佳实践
- 切勿跨服务重用令牌。 每个集成应有自己的令牌。
- 存储哈希后的令牌。 在数据库中存储
sha256(token)—— 切勿存储明文令牌。这样,数据库泄露不会暴露有效令牌。 - 设置过期时间。 短生命周期令牌(密码重置几分钟,会话几小时)可减少攻击窗口。
- 仅使用HTTPS。 URL或头部中的令牌是明文,必须在传输中加密。
- 安全事件后轮换令牌。 如果怀疑令牌被泄露,立即使其失效。
- 为令牌添加类型识别前缀。 Stripe使用
sk_live_、sk_test_等。这有助于在日志或代码仓库中识别泄露的令牌。 - 避免在URL中使用令牌。 URL参数会出现在服务器日志、浏览器历史和referrer头部中。优先使用Authorization头部或请求体。
代码中的令牌生成
// Node.js — crypto模块(内置)
const crypto = require('crypto');
const token = crypto.randomBytes(32).toString('hex'); // 64个十六进制字符
// 浏览器 — Web Crypto API
const bytes = new Uint8Array(32);
crypto.getRandomValues(bytes);
const token = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
# Python
import secrets
token = secrets.token_hex(32) # 64个十六进制字符
token_url = secrets.token_urlsafe(32) # 43个base64url字符
→ 试试 令牌生成器