library
Security
under-utils-security
字段级 AES-GCM 加密、MyBatis 显式加密 TypeHandler 和响应脱敏。
依赖
<dependency>
<groupId>io.github.yexianglun-d</groupId>
<artifactId>under-utils-security</artifactId>
<version>1.0.4</version>
</dependency> 适用场景
需要落库加密、响应脱敏和安全字段治理边界的企业服务。
能力边界
| 文档来源 | under-utils-security/README.md |
|---|---|
| API 入口 | 查看 Security 相关 API |
| 设计约束 | 保留失败语义、配置 key 和 public API 兼容性说明,不以营销描述替代真实边界。 |
AES-GCM 随机 IV 该能力来自当前模块 README 或 API Review,页面下方同步展示原始 README 内容。
keyId 密文 envelope 该能力来自当前模块 README 或 API Review,页面下方同步展示原始 README 内容。
显式 TypeHandler 接入 该能力来自当前模块 README 或 API Review,页面下方同步展示原始 README 内容。
README 同步内容
来源:under-utils-security/README.md,构建时自动读取并渲染。
字段级加密与响应脱敏模块。
本模块不替代完整权限系统、密钥管理系统或数据库透明加密。它只提供业务系统里常见的显式字段加密、MyBatis TypeHandler 接入和响应字段脱敏。
依赖
<dependency>
<groupId>io.github.yexianglun-d</groupId>
<artifactId>under-utils-security</artifactId>
<version>1.0.4</version>
</dependency>
Spring Boot 项目需要按配置创建加密器时使用:
<dependency>
<groupId>io.github.yexianglun-d</groupId>
<artifactId>under-utils-security-starter</artifactId>
<version>1.0.4</version>
</dependency>
字段加密
核心入口:
FieldEncryptorAesGcmFieldEncryptorKeyProviderStaticKeyProvider
密文格式为:
ENCv1:<keyId>:<base64url iv>:<base64url ciphertext>
示例:
FieldEncryptor encryptor = new AesGcmFieldEncryptor(
StaticKeyProvider.ofBase64("k1", base64Key)
);
String ciphertext = encryptor.encrypt("13812345678");
String plaintext = encryptor.decrypt(ciphertext);
AES key 必须是 16、24 或 32 字节,starter 配置使用 Base64 字符串。
MyBatis 字段加密
MyBatis 加密通过显式 TypeHandler 生效,不做全局隐式加密。
@TableName(value = "sys_user", autoResultMap = true)
public class SysUser {
@TableField(value = "mobile", typeHandler = EncryptedStringTypeHandler.class)
private String mobile;
}
Spring Boot starter 配置:
under:
utils:
security:
field-encryption:
key-id: k1
key: ${UNDER_UTILS_FIELD_AES_KEY_BASE64}
enabled: true
register-mybatis-type-handler: true
未配置 key 或显式设置 enabled: false 时 starter 不会创建默认 FieldEncryptor,EncryptedStringTypeHandler 也不会被注册默认加密器。
响应脱敏
public class UserResponse {
@Mask(type = MaskType.MOBILE_PHONE)
private String phone;
@Mask(type = MaskType.EMAIL)
private String email;
}
@Mask 是新增 security API;under-utils-spring 中已有的 @Sensitive 继续保留兼容,不迁移包名。
边界
- 不在日志、异常或
toString()中输出密钥。 - 不提供 KMS、轮换调度或密钥托管。
- 不承诺自动加密所有 MyBatis 字段,字段必须显式声明 TypeHandler。
- 非
ENCv1:前缀的值解密时会原样返回,便于存量明文渐进迁移。