盐值 / 随机串生成器
加密使用 crypto.getRandomValues 生成密码学安全的随机盐值与令牌(Hex 或 Base64)。
本页内容
什么是盐?#
盐是一段随机数据,你把它掺进哈希过程,让两个相同的输入产出不同的结果。它的职责是「唯一」而非「保密」:盐可以明文放在它所保护的那条哈希旁边,照样能瓦解那种依赖「同口令→同摘要」的攻击。只要每个口令各有自己的盐,攻击者就没法把一张预算好的表在整个库里复用——只能逐条重算。
本页用 crypto.getRandomValues 产出密码学强度的随机字节,并提供三种编码:hex(每字节两个字符,是口令盐与完整性令牌的通用写法)、base64(更紧凑)、base64url(URL 与文件名安全的变体,把 +// 换成 -/_ 并去掉 = 填充,常见于 JWT 与签名 URL)。
同一套底层能力也能当作通用随机令牌生成器:API key、nonce、不透明 ID、一次性令牌,本质上都是「若干随机字节,编码成文本」,正是本工具产出的东西。
怎么使用#
- 设置字节数。默认 16(128 比特)是标准盐长度;字段最大可填 8192,供你需要更长的令牌时使用。
- 选择格式:hex、base64 或 base64url。
- 点 Generate,再点 Copy。状态栏会显示这段结果代表了多少比特熵(字节数 × 8),让你一眼确认拿到了想要的量。
核心特性#
- 无偏随机字节。 取自
crypto.getRandomValues——浏览器内密码学级别的生成器。 - 三种编码。 hex 用于盐和校验和;base64 用于紧凑令牌;base64url 用于一切要进 URL、文件名、JSON 的场景。
- 诚实的熵报告。 状态栏报的是实际比特数,而不是编码后的字符串长度——后者很容易看错。
- 最长 8192 字节。 一段 16 字节的盐、一段 256 字节的密钥块,同一个工具都吃得下。
- 零上传。 生成全程本地,随机字节绝不外发。
实战示例#
分别用三种格式生成 16 字节。16 字节即 128 比特熵,无论随机值如何,编码长度都是固定的:
- hex —— 32 个字符,如
7a4c9f1e0b8d2635c4a1e9f07b2d4861 - base64 —— 24 个字符,带
==填充,如8MDwarqMD7B594C5hCB1zQ== - base64url —— 22 个字符,去掉填充,如
8MDwarqMD7B594C5hCB1zQ
(上面的值只为说明形状;每次点击你的实际输出都不同,因为字节是全新随机的。)把字节数提到 32,要做 256 比特的盐或密钥,长度会确定性地增长:hex 64 字符、base64 44 字符、base64url 43 字符。这种「字节数与编码长度一一对应」的固定关系,正是用来快速核对「我到底生成了多大」的利器。
常见问题#
盐需要保密吗?#
不需要。盐的目的是唯一——它保证同一个口令哈希两次得到不同摘要。它就明文存放在哈希旁边,并不会削弱这套方案。必须保密的是 HMAC 里的密钥、或加密时的口令,而不是盐。
该生成多少字节?#
16 字节(128 比特)是口令盐和绝大多数令牌的标准长度——它让意外碰撞实际上不可能发生。对于会话令牌,或任何要在面对资金雄厚的攻击者时长期存续的东西,32 字节(256 比特)是个从容的余量。超出这个量通常是过度,除非某个具体协议有硬性要求。
base64 和 base64url 有什么区别?#
两者编码的是同样的字节,但 base64 用了 + 和 /——这俩字符会破坏 URL 和文件名,并用 = 做填充。base64url 把它们换成 - 和 _、并去掉填充,因此结果可以直接塞进 URL 路径、查询串或文件名而无需转义。JWT、签名 URL、不透明令牌用 base64url;当输出只待在数据字段里时,用普通 base64 即可。
能拿它当 API key 吗?#
可以。生成 32 字节的 base64url,你就得到一个 43 字符、携带 256 比特熵的令牌——做 API key 或长期有效的 bearer token 绰绰有余。只是务必立刻复制,因为该值在本地生成,过后无法找回。