AES-GCM 认证加密:为什么改动一个字节就全盘失效
网上大多数「在线加密」,其实是 ECB 玩具
在搜索引擎里找「在线加密」,能找到一票网页工具:输入文字、给个密码、吐出一串 Base64。这类工具里相当一部分用的是 ECB(电码本)模式——把明文切成固定大小的块,逐块独立加密。ECB 的问题在于「图案守恒」:相同的明文块永远加密成相同的密文块。教科书里的经典演示是拿它加密一张图片,加密完的密文图片上依然能看出轮廓——因为像素块的空间规律原封不动地透进了密文。AES 本身没有错,错在用法。
更糟的是这类工具通常只回答了半个问题。现代加密必须同时回答两件事:机密性(没有密钥读不懂)和完整性(密文没有被偷换过)。ECB 连机密性都答得不及格,完整性则完全空白——密文被改掉一块,解密端往往照样「解」出一串似是而非的内容,使用者毫无察觉。AES-GCM 是把这两个问题一次性回答干净的方案。
GCM = CTR 模式 + GHASH 认证
GCM(Galois/Counter Mode)由两部分拼成。加密一半是 CTR 计数器模式:把 AES 这个分组密码当成流密码用——对「IV + 计数器」逐个加密得到密钥流,再与明文异或。加密和解密走同一条流水线,明文多长密文就多长,不需要填充。
认证一半是 GHASH:在伽罗瓦域 GF(2^128) 上对密文分块做乘加运算,算出一个 16 字节的认证标签,附在密文后面。解密端用同一把密钥把标签重算一遍,与随密文传来的标签比对——不相等就直接失败。所以「改一个字节就解不开」不是工具外加的限制,而是 GCM 的数学性质:密文的任意字节、IV、乃至附加认证数据,任何一处被改动,重算出的标签都会对不上。密码错一个字符也一样——派生出的密钥不同,标签同样对不上。解密永远要么给出原文,要么明确失败,绝不会输出一页乱码让你猜。
在浏览器里,这一切就是一行 Web Crypto 调用的事:
| |
additionalData 是 AEAD 的一个贴心设计:某些数据(比如版本号)不需要保密、但需要防篡改,就放进这里——它不进密文,却参与标签计算,改了同样过不了认证。
IV 的纪律:同一密钥下绝不重复
GCM 有一条铁律:同一密钥下,IV 绝不能重复使用。IV 重用会让两条密钥流异或相消,更灾难的是认证子密钥 H 会被推算出来——攻击者从此可以伪造能通过认证的密文,整条防线塌掉。这不是「建议」,是结构性要求。
所以工程上的做法是每次加密都随机生成 12 字节 IV,并随密文一起保存。这也顺手解释了一个常见疑问:**同一段文字、同一个密码,两次加密的密文完全不同,是不是坏了?**不但没坏,正是特性——IV 和 salt 都是每次随机生成的,密文不同但都能解开,顺带让攻击者无法通过比对密文发现「两段内容相同」。
密钥派生:把人的密码拉伸成机器的密钥
没有人记得住 256 位随机数,记得住的只有密码。密码直接当 AES 密钥用太弱——穷举人的密码比穷举 256 位密钥便宜太多。所以密码要先经 PBKDF2-HMAC-SHA256 拉伸:把密码和随机 salt 喂进 HMAC,反复迭代,把最后的结果当密钥。
站点用的是 60 万次迭代——这是 OWASP 2023 对 PBKDF2-SHA256 的推荐值,salt 用 16 字节随机数。salt 的作用是防彩虹表:同样的密码在不同次加密里派生出不同的密钥,预计算表彻底失效。而迭代次数的本质是经济学:它让暴力穷举的每一次猜测都变贵——你加密时那不到一秒的本地计算延迟,就是攻击者每试一个密码都要付的利息,乘以他字典里的每个词条。加密时「等一下」,恰恰是安全性的来源。
自描述密文格式
站点输出的密文长这样:前缀:base64(salt | iv | 密文+标签)。具体展开是三段打包:
- 版本化前缀,为将来升级算法或参数留余地——解密方先看前缀就知道该按哪套口径处理;
- 随机 salt(16 字节)与随机 IV(12 字节)直接打进密文,解密方不需要额外传任何参数;
- 最后是 AES-GCM 密文加 16 字节认证标签。
解密的顺序是先校验格式、再走 GCM:前缀不对、Base64 不合法、长度不足,直接按格式错误报「这不是本工具的密文」;格式通过后标签校验失败,才报「密码错误或内容已损坏」。两种失败分开报错是可诊断性的关键——前者说明密文来源不对(复制不完整、被替换成了别的东西),后者说明密码不对或内容被篡改,处置方式完全不同。
实用:两件全本地的工具
🔧 文本加密解密 把上面整套流程做成了网页:PBKDF2 派生与 AES 加解密全部通过浏览器原生 Web Crypto 在本机完成,密码与明文不过服务器,页面没有任何网络请求——断网也能用。文件级的配套是 🔧 文件加密 ,同样基于 PBKDF2 密钥派生加 AES-256-GCM 认证加密,对任意本地文件做保护,加解密全程不离开浏览器。
最后一条也是最重要的一条:忘记密码等于无法恢复。没有后门、没有重置邮箱、没有客服能帮你解开——密钥由密码加随机 salt 经 60 万次迭代派生,除此之外世界上不存在第二把钥匙。这不是缺陷,正是这类工具存在的意义:连开发者自己都解不开的密文,才谈得上是你的隐私。密码请务必保管好。
这几件工具连同更多隐私类小工具,都收在隐私防护套装专题里,按场景排布,随取随用。