LocalStorage不提供加密功能,所有数据以明文存储,需手动加解密;推荐使用Web Crypto API的AES-GCM模式,配合动态IV和密钥派生,避免硬编码密钥与Base64伪加密。

LocalStorage 本身不提供加密功能,所有数据都以明文形式存储在浏览器中。要实现“加密保存”,需要在写入前手动加密、读取后手动解密——核心是引入合适的加密算法,并妥善管理密钥。
为什么不能依赖 LocalStorage 自带加密
LocalStorage 是纯前端、无访问控制的键值存储。任何能运行 JavaScript 的上下文(包括页面脚本、开发者工具、恶意扩展)都能直接读写它。所谓“加密”,只是增加一层编码门槛,并不能替代服务端鉴权或敏感数据脱敏。
推荐方案:使用 Web Crypto API(现代、安全、无需第三方库)
浏览器原生支持的 Web Crypto API 提供了 AES-GCM 等强加密能力,适合对称加密场景。关键步骤如下:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
-
生成密钥:用
crypto.subtle.generateKey('AES-GCM', true, ['encrypt', 'decrypt'])创建一个 256 位密钥(不要硬编码!) -
导出密钥材料:用
exportKey('jwk', key)转为可序列化格式(如需跨会话复用,可存入 LocalStorage,但注意:密钥本身也需保护) -
加密数据:调用
encrypt({ name: 'AES-GCM', iv }, key, encoder.encode(plainText)),得到加密后的 ArrayBuffer -
保存结果:将
iv(必须随机)、密文、authTag(GCM 模式必需)一起 Base64 编码后存入 LocalStorage -
解密流程相反:取出 Base64 数据 → 解码 → 分离 iv/authTag/密文 → 调用
decrypt()→decoder.decode()还原字符串
简化实践建议(兼顾安全与可用性)
对于多数业务场景(如保存用户偏好、临时 token),可采用更轻量但依然有效的做法:
立即学习“Java免费学习笔记(深入)”;
- 用 固定盐值 + 用户唯一标识(如登录后的 user_id)派生密钥,避免密钥硬编码;派生函数推荐
crypto.subtle.importKey()+deriveKey()(PBKDF2 或 HKDF) - 始终使用 AES-GCM 模式(自动提供完整性校验),禁用 ECB、CBC 等易出错模式
- 每次加密都生成新
iv(12 字节),和密文一起存;解密时必须用同一 iv - 敏感字段(如密码、身份证号)不应出现在前端,LocalStorage 加密仅适用于低敏感度数据(如主题设置、折叠状态)
避坑提醒
常见错误会大幅削弱安全性:
- 用
localStorage.setItem('token', btoa(JSON.stringify(data)))—— Base64 不是加密,只是编码 - 把密钥写死在代码里(如
const KEY = 'my-secret-123'),极易被反编译提取 - 用 Math.random() 生成 iv —— 不满足密码学随机性要求,应使用
crypto.getRandomValues(new Uint8Array(12)) - 忽略异常处理:加密/解密失败时返回空或默认值,可能掩盖密钥不匹配、数据损坏等问题

















