crypto-random-string、nanoid 和 randomstring 都是用于生成随机字符串的 JavaScript 库,但设计目标和适用场景不同。crypto-random-string 专注于提供基于加密安全随机源的字符串生成;nanoid 以极小体积和高性能生成短而唯一的 ID,同样基于加密安全随机源;randomstring 提供高度可配置的字符串生成选项,但默认使用非加密安全的随机源,需显式启用安全模式。这些库常用于生成 token、会话 ID、临时密码或唯一标识符等场景。
在现代 Web 开发中,生成不可预测的随机字符串是常见需求 —— 无论是用于 CSRF token、会话 ID、临时密码,还是唯一标识符。crypto-random-string、nanoid 和 randomstring 是三个广泛使用的 npm 包,但它们的设计目标、API 风格和适用场景存在显著差异。本文将从实际工程角度深入比较三者的技术特性。
crypto-random-string 完全基于 Node.js 的 crypto.randomBytes() 或浏览器中的 crypto.getRandomValues(),确保输出具备 加密安全级别(cryptographically secure)。这意味着其生成的字符串无法被预测,适用于安全敏感场景。
// crypto-random-string
import cryptoRandomString from 'crypto-random-string';
const token = cryptoRandomString({ length: 32 });
// 示例输出: "x9fG2kLmQ7vR4sT8yU1iO0pA3bN6cE5d"
nanoid 同样使用 加密安全的随机源(在 Node.js 中用 crypto.randomBytes,在浏览器中用 crypto.getRandomValues),尽管它默认使用 URL 安全字符集(-_0-9a-zA-Z),但安全性不打折扣。
// nanoid
import { nanoid } from 'nanoid';
const id = nanoid(21); // 默认长度 21
// 示例输出: "V1StGXR8_Z5jdHi6B-myT"
randomstring 默认使用 非加密安全的 Math.random(),除非显式启用 cryptographicallySecure: true 选项。这在安全上下文中是一个重大隐患 —— 若忘记配置,可能引入可预测的 token。
// randomstring (默认不安全!)
import randomstring from 'randomstring';
// 危险:使用 Math.random()
const unsafe = randomstring.generate(16);
// 安全:必须显式开启
const safe = randomstring.generate({
length: 16,
cryptographicallySecure: true
});
⚠️ 注意:
randomstring的默认行为不符合安全最佳实践。在需要不可预测性的场景(如 token 生成),务必显式启用加密安全模式,否则应避免使用。
crypto-random-string 提供极简 API,只关注一件事:生成指定长度的随机字符串。支持自定义字符集,但需传入完整字符串。
// 自定义字符集
const hex = cryptoRandomString({
length: 10,
characters: '0123456789abcdef'
});
nanoid 的核心 API 极其轻量(nanoid(length)),但通过配套工具(如 customAlphabet)实现高级定制,保持主包体积最小。
// 自定义字母表
import { customAlphabet } from 'nanoid';
const nanoHex = customAlphabet('0123456789abcdef', 10);
const id = nanoHex(); // "a3f9b2e1c8"
randomstring 提供最丰富的配置选项(长度、字符集类型、排除字符等),但 API 略显冗长,且部分选项仅在非安全模式下有效。
// 复杂配置
const str = randomstring.generate({
length: 12,
charset: 'alphabetic',
capitalization: 'lowercase',
exclude: 'aeiou' // 排除元音
});
三者均支持现代浏览器和 Node.js,但实现方式不同:
crypto-random-string 使用条件导入,在浏览器中自动回退到 window.crypto,无需额外配置。nanoid 内置对浏览器和 Node.js 的适配,且提供专门的 非安全版本 nanoid/non-secure 用于测试或性能敏感场景(但明确标注不用于生产安全用途)。randomstring 在浏览器中依赖 window.crypto 实现安全模式,但文档未明确说明兼容性边界,需自行验证。对于前端项目,nanoid 因其极小的体积和清晰的模块划分(可 tree-shake)而广受欢迎。
crypto-random-string 或 nanoid// 使用 nanoid(简洁)
const csrfToken = nanoid(32);
// 使用 crypto-random-string(显式控制字符集)
const sessionID = cryptoRandomString({
length: 32,
characters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'
});
randomstring(利用其排除字符功能)const tempPass = randomstring.generate({
length: 8,
charset: 'alphanumeric',
exclude: '0O1lI' // 避免视觉混淆
});
nanoid(专为此类场景优化,默认 21 字节即可保证低碰撞率)const shortUrlId = nanoid(); // 默认 21 字符,足够用于数十亿级 ID
| 维度 | crypto-random-string | nanoid | randomstring |
|---|---|---|---|
| 默认安全性 | ✅ 加密安全 | ✅ 加密安全 | ❌ 默认不安全(需显式开启) |
| API 简洁性 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 定制灵活性 | ⭐⭐⭐ | ⭐⭐⭐(通过辅助函数) | ⭐⭐⭐⭐⭐ |
| 前端友好度 | ✅ | ✅✅(体积最小,模块清晰) | ⚠️(需注意安全配置) |
| 典型用途 | 安全 token、密钥 | 唯一 ID、短链接 | 可读字符串、测试数据 |
nanoid —— 它在安全性、体积和易用性之间取得了最佳平衡。crypto-random-string 是可靠选择。cryptographicallySecure: true 时,才考虑 randomstring。否则,其默认的不安全行为可能带来风险。记住:在涉及安全的场景中,“默认安全”比“可配置安全”更重要。一个忘记开启安全选项的开发者,比一个没有选项的库更危险。
当你需要生成短小、URL 安全、唯一性高的 ID(如短链接、数据库主键),并且重视包体积和性能时,选择 nanoid。它默认使用加密安全随机源,API 极其简洁,同时提供 customAlphabet 等工具满足定制需求。它是现代前端项目中最流行的 ID 生成方案之一。
当你的首要需求是生成加密安全的随机字符串,且希望 API 简单直接时,选择 crypto-random-string。它强制使用安全随机源,适合生成 CSRF token、会话 ID 等安全敏感数据。如果你需要完全控制字符集(例如十六进制或自定义符号),它也提供了清晰的配置方式。
仅当你需要复杂的字符串格式控制(如排除特定字符、指定大小写规则)且能确保始终启用 cryptographicallySecure: true 选项时,才考虑 randomstring。它的默认行为使用 Math.random(),不具备加密安全性,容易在安全上下文中引入漏洞。适用于生成用户可见的临时密码或测试数据等非安全关键场景。
English | 日本語 | Русский | 简体中文 | Bahasa Indonesia | 한국어 | العربية
A tiny, secure, URL-friendly, unique string ID generator for JavaScript.
“An amazing level of senseless perfectionism, which is simply impossible not to respect.”
crypto.randomUUID().A-Za-z0-9_-).
So ID size was reduced from 36 to 21 symbols.import { nanoid } from "nanoid";
model.id = nanoid(); //=> "V1StGXR8_Z5jdHi6B-myT"
Nano ID is built by Evil Martians, an American design and engineering consultancy for developer tools, AI, and cybersecurity startups.
Read full docs here.