字母数字字符:定义、加密应用、安全性
六十二。这是当有人说“只使用字母数字字符”时,可用的不同符号总数。二十六个大写字母,二十六个小写字母,十个数字。如果去掉大小写,数量就减少到三十六个。这两个数字都很重要,因为你输入过的几乎所有数字标识符——钱包地址、Wi-Fi密码、交易哈希、GitHub令牌——都是由这六十二个符号中的特定子集构成的。
大多数解释文章都会忽略选择哪个子集以及原因这一部分。而这部分恰恰将字母数字字符的百科全书式定义与加密钱包的实际安全性联系起来。本文将详细介绍字符集的构成、其背后的标准、现代密码学如何选择子集,以及美国国家密码权威机构对此的最新规定。其中一些指导原则已经发生了变化,而大多数安全建议尚未跟上。
什么是字母数字字符?定义和计数
首先来看定义。字母数字字符是指任何字母 A 到 Z(区分大小写)或任何十进制数字 0 到 9。仅此而已。接下来的计算就显而易见了——区分大小写的情况下,26 个字母加上 10 个数字,总共有 62 个不同的字符;不区分大小写的情况下,则有 36 个。其他任何字符都属于“特殊字符”。标点符号、空格、数学符号、带重音符号的字母、表情符号——这些都不算作字母数字字符。
工程师通常使用两种简写方式来满足定义要求。像 grep、sed 和 awk 这样的 POSIX 工具会识别 `[:alnum:]`,它匹配上面的 62 个字符。而大多数现代正则表达式语言——例如 Python、JavaScript、Java 和 PCRE——则使用 `\w`。`\w` 的问题在于它偷偷地加入了下划线。下划线本身并非正式的字母数字字符。大多数编程语法将其视为辅助字符,这就是为什么 Stripe 密钥前缀 `sk_live_` 和 AWS 密钥前缀 `AKIA` 混合使用了下划线、大写字母和数字,却无人察觉的原因。
“字母数字”这个词是怎么来的呢?竟然是穿孔卡片。20世纪30年代,IBM的制表设备需要一个词来表示混合了字母和数字的代码,“字母数字”这个词就此诞生。到了20世纪60年代初的IBM 1401计算机时代,这个词已经成为商业计算机领域的标准词汇。这种区分在实践中也确实有效——一个被标记为“字母数字”的字段可以接受任何字母或数字;而一个纯数字字段则完全拒绝字母。从此,“字母数字”这个词被广泛应用到车牌号、IBAN银行卡号、电话键盘助记符、产品SKU以及其他数百个领域。
区分大小写和不区分大小写的区别比表面看起来更重要。允许使用大写字母会使密码熵翻倍。比特币的 Base58 地址特意保留大小写。Bech32 则特意忽略大小写。每一种选择都是在表达能力和人为错误之间权衡。选择错误会导致人们因拼写错误而蒙受损失。

从 ASCII 到 Unicode:简要技术史
如今的“字母数字”标准是长达六十年的标准之争的幸存者。大多数用户都处于中间状态,从未察觉到任何变化。
ASCII 编码率先问世。它于 1963 年由美国标准协会发布,并在五年后正式成为 ANSI X3.4-1968 标准。此后又进行了两次修订——分别在 1977 年和 1986 年。1968 年的版本将大写字母 A 的字节码固定为 65,小写字母 a 为 97,数字 0 到 9 的字节码固定为 48 到 57。现在打开你的编辑器:你会发现字节“A”的字节码仍然是 65。六十年来,这些字节码从未改变过。
大约四十年来,ASCII 字母数字字符集一直是唯一的字符集。后来,互联网出现了。七位编码不再足够。故障模式十分糟糕:乱码邮件、数据库崩溃、在东京运行正常的日本网站,在美国的笔记本电脑上却显示成一片问号。1991 年,Unicode 诞生,它雄心勃勃:为所有文字系统中的每个字符分配一个唯一的编码。1992 年,UTF-8 作为 Unicode 的正式编码,在普通网络中承载着 Unicode 数据。它的诀窍在于向后兼容性——UTF-8 的前 128 个码位正好对应最初的 1968 个 ASCII 字节。1991 年之前发布的英文文本可以一直正常使用。
这一转变发生在2007年12月。当月,公开的网络爬虫统计数据最终显示,UTF-8 取代 ASCII 成为网络上最常用的编码。从那时起,“字母数字”不再仅仅指代 ASCII 码中的 62 个符号。Unicode 现在为西里尔字母、希腊字母、阿拉伯字母、希伯来字母和中日韩字母(CJK)分别编入了字母数字编码块。每种文字都有其自身的字母和数字。
然而,在实际应用中,需要跨域运行的软件仍然默认使用原始的ASCII字符集:拉丁字母A-Z,阿拉伯数字0-9,仅此而已。原因很简单:所有键盘都输出ASCII字符,所有数据库都接受ASCII字符,所有正则表达式引擎都识别ASCII字符。一旦超出这个范围,就会出现一系列编码错误、字符相似以及我将在下文详述的网络钓鱼攻击等问题。
| 班级 | 成员 | 数数 | 正则表达式速记 | 例子 | |
|---|---|---|---|---|---|
| 按字母顺序排列 | A–Z,a–z | 52 | `[A-Za-z]` | 简明英语单词 | |
| 数字 | 0-9 | 10 | `[0-9]` 或 `\d` | 一年,一个邮政编码 | |
| 字母数字 | A–Z、a–z、0–9 | 62 | `[A-Za-z0-9]` 或 `[:alnum:]` | API密钥,SKU | |
| 特殊/象征性 | `!@#$%^&*()_+-=[]{};:'"\ | ,.<>/?` | ~33(ASCII) | `[^A-Za-z0-9]` | 密码修改器 |
加密技术中的字母数字字符:地址、哈希值、种子
这是大多数通用解释都会忽略的部分。加密货币系统从来不会使用完整的 62 位字母数字字符集。它们会选择精心挑选的子集。每一种选择都是经过系统论证的工程妥协,而非随意的审美考量。
比特币优先。传统的比特币地址(以 1 或 3 开头的地址)采用 Base58 编码。Base58 字母表由中本聪手工设计。方法如下:取 62 个字符的字母数字集合,删除四个字符。删除的字符包括数字 0、大写字母 O、大写字母 I 和小写字母 l。为什么要删除这四个字符?用潦草的字迹把它们写在便签纸上。然后走开。五分钟后再回来。试着把它们区分开来。你肯定分不清。这就是 Base58 编码旨在解决的问题。最终只剩下 58 个字符。一个典型的传统地址最终只有 26 到 35 个字符——短到即使你真的需要,也可以手动抄写。
SegWit于2017年8月启用。随之而来的是第二种比特币地址格式:Bech32,定义于BIP-173。Bech32做出了一些不同的改动。它完全取消了大小写敏感性——所有地址均为小写。它还舍弃了四个不同的字符:数字1以及字母b、i和o。剩余的32个字母和数字内置了校验和。该校验和几乎可以自动检测出所有单字符拼写错误。自2021年11月上线以来,Taproot在研究人员发现原始数学模型中存在一个特殊情况缺陷后,将该格式改进为Bech32m(BIP-350)。
以太坊选择了第三条路:直接使用十六进制。以太坊地址由 `0x` 开头,后跟 40 个十六进制字符组成,总共 42 个字符。十六进制将字母数字组合精简到 16 个元素:数字 0-9,字母 a-f,仅此而已。在 2015 年,这种选择显得简洁明了。但经过多年用户在 MetaMask 中眯着眼睛查看原始十六进制字符串,它已经显得丑陋不堪。EIP-55 解决了这个问题。它根据小写地址的 Keccak-256 哈希值,选择性地将某些字母大写。其结果是实现了免费的拼写错误检测。EIP-55 的拼写错误检测率约为 99.975%,漏检率约为 0.0247%。虽然很小,但并非为零。
哈希值是最简单的例子。SHA-256 哈希输出为 256 位,显示为 64 个十六进制字符。以太坊的 Keccak-256 算法也生成相同长度的输出。比特币交易 ID(txid)是交易本身的 SHA-256 哈希值,因此 txid 也是 64 个字母数字十六进制字符。它们在区块浏览器中看起来可能有点吓人。它们完全由字母数字组成。
助记词打破了这种模式。BIP-39 钱包恢复是加密货币唯一一次跳出字母数字编码的框架,回归纯字母编码领域。该标准将 128 或 256 位熵编码为 12 或 24 个英文单词,这些单词取自一个固定的 2048 个单词的列表。每个单词都只包含小写字母——没有数字,也没有大小写混合。为什么?因为其设计目标用户是凌晨 3 点手机没电后在纸上写下单词的人,而数字会引入字母不会产生的歧义。
| 标识符 | 字符集 | 长度 | 示例(已截断) |
|---|---|---|---|
| 比特币传统地址 | Base58(58 个字符,不含 0/O/I/l) | 26–35 | `1A1zP1eP5QGefi2…` |
| 比特币 Bech32(隔离见证) | 32 个小写字母,无 1/b/i/o | 约42 | `bc1qar0srrr7xfk…` |
| 以太坊地址 | 十六进制(0–9,a–f)+ `0x` | 42 | `0xde0B295669a91…` |
| SHA-256 / txid | 十六进制 | 64 | `e3b0c44298fc1c1…` |
| BIP-39 词 | 仅限 a–z | 每字 3–8 | `放弃能力能够……` |
每个子系统都是以人为本的设计,隐藏在高度技术化的系统中。
字母数字密码:NIST 在 2024 年的实际建议
网上大多数密码建议都已过时数年。混合大小写、添加数字、至少包含一个特殊字符、每九十天更换一次——这些规则曾是二十年来的金科玉律。但美国国家标准与技术研究院(NIST)已正式放弃了这些规则。
美国国家标准与技术研究院 (NIST) 特别出版物 800-63B 是联邦政府制定的数字身份指南权威文件,于 2024 年 9 月发布了第四版修订版。新指南的显著特点在于大幅精简。单因素身份验证的最小密码长度建议提高到 15 个字符。字符组成规则的表述改为“不得”:服务不得要求使用特定字符类别。此外,备受诟病的密码定期过期(90 天轮换)也被取消。取而代之的是,NIST 现在要求服务将提交的密码与已知泄露凭证的黑名单进行比对。
这种变化可以用熵的数学原理来解释。一个包含 62 个字符的字母数字字符池,每个字符大约产生 5.95 位。完整的 95 个字符的可打印 ASCII 字符池(包括字母数字字符和特殊字符)产生 6.57 位。添加所有特殊字符后,每个字符的比特数增加 0.62 位。再增加一个字符,每个字符的比特数就达到 5.95 位。字符长度对复杂度的影响比字符长度大一个数量级。
Verizon 发布的《2025 年数据泄露调查报告》显示,凭证泄露占所有已确认泄露入口点的 22%。凭证填充攻击(即自动重复使用泄露的密码列表)的中位数占身份验证尝试的 19%,峰值可达 44%。49% 的用户在不同服务中重复使用密码。强制使用大写字母并不能解决上述任何问题。
不包含特殊字符的较长字母数字密码比为了满足复杂度要求而设置的短密码更难破解。如果您的银行仍然强制您设置包含一个大写字母、一个数字和一个特殊字符的十二位密码,那么这项政策现在已经正式与美国联邦标准不符。
字母数字字符还出现在哪些地方?
抛开加密技术不谈,密码和字母数字字符串仍然会在需要人类可以输入、计算机可以无歧义地解析的标识符的系统中出现。
银行代码就是一个简单的例子。IBAN 最长可达 34 个字母数字字符,并且总是以两位字母的 ISO 国家代码开头。SWIFT/BIC 代码则为 8 或 11 个字符。车牌因国家/地区而异——英国车牌与德国车牌截然不同——但它们都是同一 62 个字符池中的字母数字子集。车辆识别码 (VIN) 在全球范围内均为 17 个字符,并且特意禁用字母 I、O 和 Q,以使其在视觉上与数字区分开来。
API 密钥是大多数用户日常生活中很少关注的例子。Stripe 的 Live Key 会打开一个以 `sk_live_` 开头的账户,后面跟着一个字母数字组合的令牌。AWS Access Key 会打开一个以 `AKIA` 开头的账户,后面跟着 16 个字母数字字符。2021 年之后颁发的 GitHub 个人访问令牌会打开一个以 `ghp_` 开头的账户。这些前缀本身就是字母数字组合,这样做是为了让服务提供商能够扫描公共代码库和日志,查找泄露的密钥。在很多情况下,这种扫描能够在攻击者之前发现漏洞。
二维码值得一提。ISO/IEC 18004 标准定义了一种专用的“字母数字模式”,它对特定的 45 个字符集(大写字母、数字、空格和少量标点符号)进行编码,效率比通用的字节模式更高。仅包含大写字母数字内容的二维码,其每个方格存储的数据量大约是相同内容以原始字节编码的二维码的 1.6 倍。
Base32、Base58、Base64:当加密算法选择一个子集时
目前存在一些专门用于将二进制数据映射到字母数字子集的编码标准。相关参考资料是 IETF 于 2006 年发布的 RFC 4648,其中定义了三种编码方式。
十六进制是其中最简单的。官方名称是 Base16,由 0-9 和 a-f 这 16 个字符组成。它用于以太坊地址、加密哈希以及几乎所有需要读取原始字节的底层调试。Base32 则更有意思。选择这 32 个字符的字母表是为了避免区分大小写,并且在某些变体中,还去掉了容易混淆的数字 0、1、8 和 9。任何设置过双因素身份验证并在 Google Authenticator 中输入过密钥的人,实际上都输入过 Base32 编码——而且大多数情况下他们自己都没意识到。
Base64 是主流编码方式。它由 62 个字母数字字符以及两个符号 `+` 和 `/` 组成。URL 安全版本则用 `-` 和 `_` 替换了这两个符号。Base64 用于承载电子邮件附件、编码 HTML 中的数据 URL 以及打包用于 OAuth 的 JSON Web Token。
比特币的 Base58 编码并不遵循 RFC 4648 标准。它是由中本聪独立开发的。其目标并非提高每字符的字节效率,而是方便用户重复输入地址,因此最终形成了一种无人使用的自定义字母表。Base85(有时也称为 Ascii85)则反其道而行之。它将四个字节压缩成五个字符,并应用于 PDF 和 PostScript 文件中,在这些文件中,更高的密度弥补了可读性的损失。

常见陷阱:视觉混淆和相似物
密码学之所以选择字母数字子集,原因与所有人犯错的原因相同。少数几个字符对是造成大部分问题的根源。
经典的易混淆字母:数字 0 和大写字母 O;数字 1、小写字母 l 和大写字母 I;小写字母 l 和大写字母 I。比特币 Base58 编码正是为了避免混淆而剔除了这四个字母。其他系统则采用不同的应对措施——车辆识别码 (VIN) 会剔除 I、O 和 Q,一些金融代码会完全剔除 O,甚至有些国家的车牌规则会禁止使用在该国字体中最像数字 0 的字母。
Unicode同形异义词攻击是一个更棘手、更新近的问题。Evgeniy Gabrilovich 和 Alex Gontmakher 在 2001 年的一篇论文中记录了这一概念。同形异义词是指将不同文字系统中视觉上相同的字符替换为拉丁字母的“a”(U+0061)。注册一个包含这种替换的域名,就可以搭建一个与真实银行网站几乎无法区分的钓鱼页面。现代浏览器会在域名混合使用不同文字系统时显示原始的 Punycode 表示形式,例如 `xn--80akhbyknj4f`。这种防御机制可以拦截大多数攻击,但并非全部。
如何在2026中创建强字母数字密码
三条规则。全部都直接源自美国国家标准与技术研究院(NIST)的数学模型。
第一:长度比字符类别更重要。尽量使用至少 16 个字符。无论系统只接受字母和数字,还是接受完整的可打印 ASCII 字符集,这条规则都适用。
第二:如果必须记住密码,请使用密码短语。从大型列表中随机选择四个单词(Diceware 列表是首选),其安全性几乎优于任何人为构造的任何短密码。
第三:对于其他所有情况,请使用密码管理器。让管理器生成长长的字母数字字符串,您再也不用手动阅读或输入了。一旦管理器处理了输出,输出的可读性就完全无关紧要了。
快速参考:字母数字计数和示例
区分大小写时,共有 62 个字符;不区分大小写时,共有 36 个字符。ASCII 码 48-57 代表数字,65-90 代表大写字母,97-122 代表小写字母。可以使用正则表达式 `[A-Za-z0-9]` 或 POSIX 类 `[:alnum:]` 来匹配整个字符集。这 62 个字符构成了你本周接触到的几乎所有数字标识符的基础。密码、API 密钥、IBAN、车牌号、交易 ID,以及你生成的每一个钱包地址,都离不开它们。