java注解本身不执行加密,而是通过参数精确声明算法、密钥、时机等信息,由处理器动态调度对应策略实现字段级精准加解密。

Java 中注解本身不直接执行加密算法,而是作为“标记”和“配置载体”,把字段的脱敏/加密需求声明出来;真正执行加密逻辑的是配套的处理器(如序列化器、AOP切面、MyBatis 插件等)。所谓“精确标记加密算法”,本质是通过注解参数将算法类型、密钥来源、加解密时机等关键信息绑定到具体字段上,再由统一处理器按需调度。
下面从实际落地角度说明如何做到“精确”:
用注解声明加密意图与算法选择
注解需暴露可配置项,让开发者明确指定加密方式,而不是默认模糊处理。例如:@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypt {
// 指定加密算法(非字符串硬编码,用枚举保证类型安全)
CryptoAlgorithm algorithm() default CryptoAlgorithm.AES_GCM;
// 密钥标识(用于从密钥管理服务或配置中心获取,而非写死在注解里)
String keyId() default "default-aes-key";
// 加密时机:仅存储时?仅响应时?还是双向?
EncryptPhase phase() default EncryptPhase.STORE_ONLY;
// 是否启用(避免全局开关失效时误操作)
boolean enabled() default true;
}
其中 CryptoAlgorithm 枚举可定义:
-
AES_GCM(推荐,带完整性校验) -
SM4(国密合规场景) -
RSA(仅适合小数据,如加密 AES 密钥) -
CUSTOM(配合customHandler()方法扩展)
让注解与具体加密实现解耦又联动
注解只声明“要什么”,不实现“怎么做”。真正的加解密由策略工厂按注解参数动态选取:- 注解中标记
algorithm = CryptoAlgorithm.SM4, keyId = "sm4-prod-key" - 处理器(如 MyBatis Plus 的
MetaObjectHandler或 Spring AOP)读取该注解 - 调用
CryptoStrategyFactory.getStrategy(annotation)获取对应SM4Encryptor实例 - 该实例从密钥中心拉取
sm4-prod-key对应的密钥,执行加解密
这样,同一个注解可适配不同算法,同一算法也可复用不同密钥,精准可控。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
结合使用场景区分加密与脱敏语义
注意:**加密 ≠ 脱敏**。注解设计必须体现业务意图差异:-
@Encrypt:用于存储敏感字段(如密码、银行卡号),要求可逆、强安全、密钥受控 -
@Mask或@Sensitive:用于展示层(如 API 返回),不可逆、规则简单(掩码/替换)、无密钥依赖
若强行用一个注解混用两者,会导致:
- 存储字段被错误掩码(无法还原)
- 展示字段被强加密(前端无法解析、性能浪费)
所以“精确标记”的前提是:先分清字段用途,再选对注解类型。
支持运行时动态策略(应对合规变化)
某些监管要求会随时间调整(如某类数据从“可逆加密”改为“单向哈希”)。这时注解可预留扩展能力:// 支持运行时覆盖策略 String strategyClass() default ""; // 指定自定义处理器全限定名 boolean useRuntimeConfig() default false; // 启用配置中心动态覆盖
当 useRuntimeConfig = true 时,处理器优先查配置中心(如 Apollo/Nacos)中 encrypt.user.id-card.strategy=HASH_SHA256,而非注解默认值——实现算法策略热更新,无需发版。
注解不是魔法,它的价值在于把“谁、在哪、用什么、怎么用”这四个问题,用声明式语法固化下来。只要参数设计贴合真实需求,配合清晰的处理器路由机制,就能做到字段级加密算法的精确绑定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










