Web Crypto API 不满足 FIPS 140-2/3 认证要求,因其运行在非受控前端环境,缺乏安全边界、密钥保护和物理防护等FIPS必需条件;仅算法支持不等于模块合规,不可用于强制FIPS审计场景。

Web Crypto API 本身不满足 FIPS 140-2/3 认证要求,前端环境无法构建真正符合 FIPS 标准的加密方案。
为什么 Web Crypto API 不能用于 FIPS 合规场景
FIPS 140 认证针对的是**密码模块(cryptographic module)**,要求对硬件、固件、操作系统层、密钥生命周期、物理安全等做完整验证。浏览器运行在通用操作系统上,Web Crypto API 是 JS 暴露的封装接口,底层实现(如 Chromium 的 BoringSSL、Firefox 的 NSS)虽可能调用经认证的库,但整个执行环境(内存可读写、无防篡改机制、JS 可被调试/注入)完全不满足 FIPS 对“安全边界的定义”。
常见误判点:
- 看到
SubtleCrypto支持AES-GCM、SHA-256就认为“算法合规 = 方案合规”——FIPS 认证不只看算法,更看模块如何部署和保护密钥 - 混淆“FIPS-approved algorithms”和“FIPS-validated implementation”:浏览器支持 SHA-256 是算法层面可用,但未通过 NIST CMVP 验证流程
- 试图用
importKey({extractable: false})模拟密钥保护——该标志仅限制 JS 导出,不影响内存 dump 或 DevTools 检查
哪些场景下仍可谨慎使用 Web Crypto API
当目标是“提升传输中/静态数据的保密性”,而非满足审计硬性条款时,SubtleCrypto 仍具实用价值,但需明确边界:
立即学习“前端免费学习笔记(深入)”;
- 仅用于增强型客户端加密(如端到端邮件草稿加密),服务端不依赖其输出做合规断言
- 密钥必须由可信后端派生或注入(如通过
HKDF+ 服务端提供的 salt),禁止在前端生成长期主密钥 - 避免使用
RSA-OAEP等需私钥运算的场景——私钥一旦出现在 JS 内存即失控;优先选ECDH密钥协商 + 前端临时密钥对 -
generateKey('AES-GCM', true, ['encrypt', 'decrypt'])生成的密钥不可持久化到localStorage,应配合IndexedDB+ 清理策略(如页面卸载时调用crypto.subtle.destroy())
替代路径:如何向合规团队解释前端加密定位
与其强行对标 FIPS,不如厘清责任边界并提供可审计的补充控制措施:
- 将前端加密明确定义为“数据可用性增强层”,核心合规控制(密钥管理、审计日志、访问策略)全部落在服务端和 HSM 上
- 在威胁模型中注明:“Web Crypto 加密不缓解 XSS、恶意扩展、内存抓取等前端特有风险,其价值在于降低明文数据意外落盘或被中间人截获的概率”
- 若审计方坚持 FIPS 要求,唯一可行方案是移除前端加密逻辑,改用服务端代理加密(如通过
/api/encrypt接口,由后端调用 FIPS 验证的库处理) - 所有密钥派生必须显式标注 PRF:例如用
deriveKey('HKDF', baseKey, {hash: 'SHA-256', salt: salt, info: new Uint8Array([1])}, {name: 'AES-GCM', length: 256}, true, ['encrypt']),避免默认参数引发算法歧义
真正棘手的不是怎么调用 encrypt(),而是如何让安全团队接受“前端没有密钥安全”这个前提——所有看似加固的操作,都只是把攻击成本从秒级拉高到小时级,而不是建立信任锚点。

















