Torinoa Tools是一个单人维护的边项目,定位很直接:一套只跑在浏览器里的开发者小工具。其中有一个模块是AES加密/解密工具,支持AES-GCM和AES-CBC两种模式,加密解密全程在浏览器内完成。
这件事的特殊之处在于,它没有引入CryptoJS,也没有依赖任何外部加密库。工具调用的完全是浏览器原生的SubtleCrypto——也就是Web Crypto API。从头到尾,一行第三方加密代码都没用。
![]()
这样做的理由有三条:打包体积小、SubtleCrypto作为原生实现比纯JavaScript加密库更快且更可审计、依赖越少维护负担越轻。但代价同样明确——SubtleCrypto是一套底层API,从用户输入的密码派生出密钥,还要自己管理盐值和初始化向量,这些事情全得开发者自己扛。
用户敲进输入框的是一串口令,而不是现成的AES原始密钥。工具内部用PBKDF2把这串口令转成真正的密钥。这个过程在代码里被拆成两步。第一步,用importKey把口令当成PBKDF2的密钥材料导进来。第二步,调用deriveKey从这份材料里实际派生出AES密钥。迭代次数设置在10万次,哈希算法用的是SHA-256。因为一切运算都发生在客户端,不能把界面卡死,10万次是一个在安全和浏览器阻塞时长之间权衡出来的数字。
工具对AES-GCM和AES-CBC的使用也有一层安全考量。相同的密钥和初始化向量被重复使用,在AES加密里是相当危险的操作。所以每次加密都会生成全新的盐值和初始化向量。解密的时候这两样东西缺一不可,于是设计上干脆把它们和密文打包进同一个字节数组,最后做Base64编码。
具体的打包格式是这样布局的:最前面是两个字节的头信息,分别标注算法类型和密钥长度;紧接着是盐值;再往后是初始化向量;最后才跟着密文本体。这套自包含的数据结构意味着,拿到一个Base64字符串,里面已经同时装着算法、密钥长度、盐值、初始化向量和密文这五样信息,解密端不需要额外传参。
从头到尾翻看这个工具的代码逻辑会发现,它几乎把SubtleCrypto能给的灵活性全部吃透了。生成随机盐值和初始化向量靠的是crypto.getRandomValues,加密动作交给crypto.subtle.encrypt,前面的密钥派生链路则走crypto.subtle.importKey加上crypto.subtle.deriveKey。整个链路没有跳出浏览器原生的Web Crypto API范围,但要在PBKDF2派生、盐值管理、初始化向量生成、二进制打包这几个环节上全部自己编排,对实现者的耐心和要求都不低。
做成这件事的价值不在加密算法本身——AES-GCM和AES-CBC都是成熟多年的标准——而在于它证明了浏览器内置能力已经足够撑起一个完整可用的加密工具,不必非得拖进一个体积不小的第三方库。对于一个追求极简依赖、关心可审计性和运行时性能的开发者工具来说,这条路是走得通的。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.