全链路安全加密存储需覆盖配置、存储、传输、会话与前端五层:配置层禁明文密钥,用Jasypt或KMS动态管理;存储层通过MyBatis TypeHandler实现字段级AES-256-GCM透明加解密;传输层强制HTTPS+HSTS,Token以HttpOnly Cookie下发;前端禁用localStorage存敏感数据,内存操作后及时清空,展示自动脱敏。

实施 Web 应用中关键敏感数据的全链路安全加密存储,核心是把“加密”从零散补丁变成贯穿数据生命周期的默认能力——从落盘、传输、使用到展示,每个环节都设防,且不增加业务代码负担。
一、配置层:先堵住明文泄露的源头
数据库连接密码、Redis 密钥、第三方 API Key 等配置信息,绝不能以明文写在 application.yml 或 properties 文件里。
- 用 Jasypt 或 Spring Boot 2.4+ 内置的加密属性支持,对敏感配置项加密后存入配置文件,启动时由框架自动解密
- 更进一步,接入企业级密钥管理服务(如 HashiCorp Vault、阿里云 KMS),运行时动态拉取密钥,配置文件里只留标识符
- 禁止将密钥硬编码在前端代码或打包产物中;前端所需密钥(如上传直传 token)必须由后端接口动态签发,带时效与权限限制
二、存储层:数据库字段级透明加解密
用户身份证号、手机号、银行卡号等,即使数据库被拖库,也应让攻击者拿到的是无法还原的密文。
- 基于 MyBatis TypeHandler 实现自动加解密:在实体类字段上标注 @Encrypted 注解,写入前自动 AES-256-GCM 加密,查询时自动解密,业务层完全无感
- 避免使用 ECB 模式;优先选用 GCM(带认证)或 CBC(配随机 IV);国密合规场景强制使用 SM4
- 对需要模糊查询的字段(如手机号前三位),可采用“确定性加密”或“前缀哈希索引”,但需评估安全性折衷
三、传输与会话层:强制 HTTPS + 安全 Token 管理
传输过程不加密,等于裸奔;Token 存错地方,等于给 XSS 开门。
- 全站启用 HTTPS,并配置 HSTS 头,禁止任何 HTTP 回退
- 用户 Token 必须由后端通过 HttpOnly + Secure + SameSite=Strict Cookie 下发,前端 JS 无法读取,彻底规避 XSS 窃取
- 若必须前端参与 Token 管理(如跨域 SSO 场景),则 Token 本身需加密(如用 RSA 公钥加密)且设置短期有效期,配合刷新机制
四、前端层:本地存储不存明文,内存不留痕
前端不是安全孤岛,而是全链路最后一环。
- 禁用 localStorage/sessionStorage 存储 Token、手机号、身份证号等;确需缓存,必须用 Web Crypto API 或 crypto-js 进行 AES 加密,密钥从后端动态获取,绝不硬编码
- 敏感数据加载进内存后,操作完成立即手动清空变量(如赋值 null)、清除 DOM 中含敏感内容的节点
- 页面展示时自动脱敏:手机号显示为 138****1234,身份证号显示为 110101****002X,用 Jackson @JsonSerialize 注解或 Vue/React 自定义过滤器统一实现

















