随机字符串生成器
使用自定义字符集生成安全随机字符串。
🔒 100% 本地处理——字符串由 crypto.getRandomValues 生成,绝不存储
字符集
结果
生成加密安全的随机字符串,长度、数量和字符集完全可控。自由组合小写、大写、数字、符号和 hex,加入你自己的字符,再用一个开关去掉易混淆的近似字符。它面向需要令牌、ID 和测试数据的开发者,也适合任何需要批量生成随机值的场景。
生成器如何产生随机性
生成器从不调用 Math.random。每个字符都通过 Web Crypto API 的 crypto.getRandomValues 抽取,返回的是加密学强度的字节。如果直接用「随机字节对字母表长度取模」来挑选字符,前几个字符会偏多,所以代码改用拒绝采样:先计算字节范围内能容纳的字母表长度的最大整数倍,任何超过它的字节都丢弃并重抽,直到字节有效为止,再对字母表长度取模得到字符。实际效果是每个字符的概率完全相同——这正是令牌、nonce 和测试数据所需要的。
实操示例:一个 16 位令牌
保持默认设置,你会得到小写、大写和数字——一个 62 字符的字母表——长度为 16。某一次运行可能返回:
K7mQ2vXp9RaTZ4bH
这是 16 个字符,其熵为 16 乘以 log2(62),约为 95 位,远远超过会话标识符所需。如果只勾选 hex,字母表缩小到 16 个字符,同样 16 位长度只承载 64 位熵。要用 hex 达到默认强度,就需要 24 个字符,因为 log2(16) 等于每字符 4 位,95 除以 4 向上取整为 24。
字符集与熵
五组内置字符集在被勾选时会合并使用:
| 字符集 | 大小 | 说明 |
|---|---|---|
| 小写 | 26 | a–z |
| 大写 | 26 | A–Z |
| 数字 | 10 | 0–9 |
| 符号 | 27 | ! @ # $ % 以及括号等标点 |
| hex | 16 | 0–9 与 a–f |
每字符的熵是字母表大小的以 2 为底的对数,所以每多勾一组就会增长。总熵等于该值乘以长度。这意味着长度和字母表宽度可以互换:一个 20 位的全字符集字符串和一个更长的 hex 字符串可以达到相同的强度。工具把单个字符串上限设为 1000 字符,单批上限设为 100 个。
自定义字符与易混淆过滤
自定义字符输入框的内容会并入你勾选的字符集,随后整个字母表去重。当下游系统只允许很窄的标点子集,或者你需要固定的前缀字符组时,这很实用。开启「排除易混淆字符」后,I、l、1、O、0 会从最终字母表中移除。它适用于需要由人读出或重新输入的字符串——推荐码、一次性验证码、许可证密钥——把大写 I 和小写 l、零和 O 弄混,往往会造成真实的售后工单。
常见错误
- 以为字符串唯一。 随机性防止的是可预测,而不是碰撞。100 个一批里完全可能有两个相同,字母表越小越容易。
- 不加评估就把默认输出当机密用。 默认强度不错,但一个很短的纯 hex 字符串并不强。字母表和长度要匹配威胁模型。
- 忘了自定义字段也会被过滤。 如果你在自定义里输入
IO10又开着易混淆过滤,四个字符全被移除,可能触发「字符集为空」错误。 - 需要整批却只复制了一个。 「复制全部」会用换行符把整批连起来,每一行另有单独的复制按钮。
- 误以为输出会被保存。 什么都不会存储,离开页面前请先复制好需要的内容。
这些字符串的用武之地
- 会话与 API 令牌。 32 位全字符集字符串约有 190 位熵,用于开发和测试环境的 Bearer 令牌绰绰有余。
- 测试夹具与种子。 一次生成 100 个 ID,粘进测试文件里检验长度和字符集校验逻辑。
- 推荐码与优惠码。 打开大写和数字,启用易混淆过滤,长度控制在电话里容易念出来的范围。
- 盐值与 nonce。 32 位纯 hex 字符串提供 128 位,能直接塞进各类哈希库。
- 示例中的占位密钥。 为文档生成看起来逼真的值,而不暴露任何真实内容。
涉及安全的工作,请用浏览器的加密随机源生成,再把结果存进密钥管理服务。生成器本身的随机性是合格的,但一个被写进文件或粘进工单的值,一旦被分享就不再是机密。字符串长度还要匹配它的生命周期:五分钟后过期的验证码需要的位数,远少于存活一年的密钥。
长度和字母表都很重要,很容易在一项上过度投入却在另一项上供给不足。一个从纯数字抽出的长字符串总熵不小,但每个位置仍只是十种可能之一,单一位很容易被猜中。保护整个值的是总熵,因此优先选择宽阔的字母表加合理的长度,而不是极端长度配窄字母表。工具的上限是为了保证响应速度:1000 字符是页面能构建的最长单串,100 是它能一次渲染的最大批次。
相关工具
常见问题
拒绝采样在这里到底做了什么?
生成每个字符时,工具会抽取一个 0–255 的随机字节。如果这个字节落在字符集大小的最大整数倍之上,就被丢弃并重新抽取。这样可以消除直接用「字节 % 字符集大小」带来的取模偏差,让字符集中每个字符的概率完全相等。
默认字符集是什么,默认输出有多强?
默认勾选小写、大写和数字,构成 62 个字符的字母表;默认长度为 16,约 95 位熵(16 乘以 log2(62))。需要更强时,打开符号或增加长度即可。
hex 能和大写字母或数字组合吗?
可以。所有勾选的字符集会先拼接再用集合去重,所以 hex 加数字只会贡献一次那十个数字。最终字母表是去重后的结果,分布保持均匀。
易混淆字符过滤也会作用于自定义字符吗?
会。合并自定义字符之后,I、l、1、O、0 会从最终字母表中移除,因此当开关打开时,含这些字符的自定义集合也会失去它们。
生成的字符串保证唯一吗?
不保证。随机生成会发生碰撞,批次越大或字母表越小,概率越高。需要无碰撞标识符请改用 UUID 生成器;作为测试数据时,请把重复视为正常并自行去重。
为什么会出现「字符集为空」错误?
它表示没有任何字符来源产出内容:可能是所有复选框都未勾选且自定义框为空,也可能是你只提供了会被过滤器移除的易混淆字符。
由 HandyTools Hub 团队审校 · 最后更新