java敏感数据加密存储核心是“加密存、按需解、权限控”,需嵌入数据生命周期全程;优先选aes对称加密,密钥须安全保管,结合注解自动加解密与动态脱敏。

Java 中对敏感数据进行封装加密存储,核心是“加密存、按需解、权限控”,不是简单套个工具类就完事。关键在于把加密逻辑嵌入到数据生命周期中——从对象赋值、入库、查询到返回前端,全程可控可审计。
选对算法:AES 对称加密是主流选择
身份证号、手机号这类结构固定、查询频繁的字段,优先用 AES(如 AES-128 或 AES-256)。它加解密快、密文长度可控,且支持确定性加密(同一明文每次加密结果一致),便于数据库等值查询。
不建议用 MD5 或 SHA 类摘要算法——它们不可逆,无法还原原始数据,只适合密码校验场景;也不推荐直接用 RSA 加密长文本,性能差、有长度限制,更适合加密 AES 密钥本身(即数字信封模式)。
- 密钥必须安全保管:硬编码在代码里是大忌,应通过 Spring Boot 的
application.yml+ 环境变量或 KMS 服务注入 - 推荐使用
AES/GCM/NoPadding或AES/CBC/PKCS5Padding模式,避免 ECB(易被模式分析攻击) - 初始化向量(IV)需随机生成并随密文一同存储(如拼接 Base64 后存入数据库),不能复用
封装进实体层:用 Lombok + 自定义注解自动加解密
避免每个 setter/getter 手动调 encrypt/decrypt。可在实体类字段上加自定义注解(如 @Sensitive),再配合 Hibernate 的 AttributeConverter 或 MyBatis 的 TypeHandler,在持久化前后自动触发加解密。
例如,定义一个 IDCardNumberConverter:
- 保存时:
convertToDatabaseColumn()调用 AES 加密 → 存密文(Base64 字符串) - 读取时:
convertToEntityAttribute()自动解密 → 返回明文供业务使用 - 这样业务代码完全无感,DAO 层透明处理,也规避了手动遗漏风险
动态脱敏:后端返回前按角色过滤明文
数据库里存的是密文,但不同角色看到的内容要分级——客服只能看 138****1234,管理员才能看完整号码。这不能靠前端 JS 做,必须在 Java 后端拦截。
- 用 Spring AOP 定义一个
@Desensitize切面,在 Controller 方法返回前扫描响应体中的敏感字段 - 结合
SecurityContextHolder获取当前用户权限,调用统一脱敏工具类(如根据字段类型匹配脱敏规则) - 手机号保留前3后4,身份证号保留前6后4,邮箱保留用户名首尾字符——规则可配置、可扩展
密钥与密文的安全边界要划清
加密只是手段,密钥管理才是命门。哪怕算法再强,密钥泄露等于裸奔。
- 应用运行时密钥不要写死,Spring Boot 可通过
@ConfigurationProperties绑定外部密钥配置,并启用 Jasypt 或自研密钥解密器加载 - 数据库字段类型建议用
TEXT或VARCHAR(255)存 Base64 密文,别用CHAR浪费空间 - 日志中严禁打印原始敏感值,可用
%replace{}过滤 Logback,或用 MDC 标记后统一脱敏输出
整个过程不复杂但容易忽略细节。重点不在“能不能加”,而在“加得稳、管得住、用得准”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











