# mybatis-plus-sensitive **Repository Path**: jankinliu/mybatis-plus-sensitive ## Basic Information - **Project Name**: mybatis-plus-sensitive - **Description**: 数据库敏感字段(多种方式加密保存、更新。自定义算法支持敏感字段加密后的模糊查询。对查询结果进行自动解密) - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2024-11-30 - **Last Updated**: 2026-03-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mybatis-plus-sensitive ## 介绍 该项目是一个基于MyBatis-Plus的敏感数据加密解密插件,主要用于对数据库中的敏感数据进行加密存储和解密读取。通过注解的方式,可以方便地实现对字段的加密和解密。同时支持对接口响应数据进行脱敏。 ## 功能 1. 对数据库字段进行加密存储,确保敏感数据的安全性。 2. 对查询结果进行解密读取,透明化加密数据的使用。 3. 支持多种加密算法,通过配置灵活切换,也可自定义去拓展加密算法。 4. 支持接口数据脱敏,通过自定义注解和AOP切面实现,也可自定义去拓展脱敏显示的规则。 5. mybatis-plus查询敏感字段方面:支持lambda、支持mapper层、支持mapper.xml查询(一句话概括基本都支持) ## 使用方法 ### 1. 引入依赖 在pom.xml中引入插件依赖(请自动拉源码打包Maven): ```xml com.lyy.mybatis.sensitive mybatis-plus-sensitive-starter 1.0-SNAPSHOT ``` ### 2. 注解配置 在实体类上标注`@SensitiveTable`,并在字段上使用`@SensitiveField`注解来指定需要加密的字段,例如: ```java @Data @TableName(value = "user", autoResultMap = true) @SensitiveTable//标明该类为敏感数据表 public class UserEntity { @TableId(value = "id", type = IdType.AUTO) private Integer id; //标明该字段为敏感字段,并指定Secret62加密算法 //Secret62自定义的加密算法,仅支持数字和英文的加密,可支持加密后的模糊查询 @SensitiveField(Secret62.class) private String mobile; // 明示该字段为敏感字段,并指定Aes加密算法 @SensitiveField(Aes.class) private String addr; } ``` ### 3. 接口脱敏 通过自定义注解`@MarkStar`标记响应对象中的敏感字段,并使用AOP切面实现接口数据脱敏,例如: ```java @Data @ToString public class UserRes { private Integer id; // 默认脱敏规则:中间打星(明文前三位后四位) @MaskStar(MaskStrategy.DEFAULT) private String mobile; // 地址脱敏:地址(明文前6位),其余位打星 @MaskStar(MaskStrategy.ADDR) private String addr; // 支持接口返回的嵌套对象的属性字段脱敏 private Other other; } ``` ## 能力拓展 ### 拓展加密算法 通过继承`SecretAbstract`类并实现其方法来拓展加密算法。例如,创建一个新的加密算法类`MySecretAlgorithm`: ```java public class MySecretAlgorithm extends SecretAbstract { @Override public String encrypt(String content) { // 实现加密逻辑 return encryptedContent; } @Override public String encryptWithOutFlag(String content) { // 实现加密逻辑,并不带加密标识 // 针对于有些场景需要模糊查询数据,可能需要将特定的加密标识符去掉,跟自己使用的算法相关 // 如果不需要自动化的模糊查询,那么这里的可以直接返回 return encrypt(String content); return encryptWithOutFlagContent; } @Override public String decrypt(String content) { // 实现解密逻辑 return decryptedContent; } } ``` 使用:`@SensitiveField(MySecretAlgorithm.class)` ### 拓展脱敏规则 重写或附加这个枚举类的规则即可 ```java @Getter @AllArgsConstructor public enum MaskStrategy { /** * 中间打星(明文前三位后四位) */ DEFAULT((str) -> MaskUtil.maskWithStar(str, 3, 4)), /** * 地址(明文前6位),其余位打星 */ ADDR((str) -> MaskUtil.maskWithStar(str, 6, 0)), /** * 全星 */ ALL((str) -> MaskUtil.maskWithStar(str, 0, 0)), // todo自定义规则 Other((str) -> { /* return 自定义脱敏后的字符串 */ }), ; private final IMaskStrategy strategy; } ``` 使用:`@MarkStar(MaskStrategy.Other)` ## 示例 本项目自带一个示例模块`mybatis-plus-sensitive-demo`,包含完整的配置和使用示例,可以作为参考。 - 测试项目源码:[mybatis-plus-sensitive-demo](mybatis-plus-sensitive-demo) - 其中[ServiceTest.java](mybatis-plus-sensitive-demo%2Fsrc%2Ftest%2Fjava%2FServiceTest.java)为单元测试示例,包含了多种场景的测试用例。 - mapper层的示例:[UserMapper.java](mybatis-plus-sensitive-demo%2Fsrc%2Fmain%2Fjava%2Fcom%2Flyy%2Fmybatis%2Fsensitive%2Fdemo%2Fmapper%2FUserMapper.java) ### 示例项目的DDL ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `mobile` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号', `addr` varchar(255) DEFAULT NULL COMMENT '地址', `other` json DEFAULT NULL COMMENT '其它', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; ``` ### 加密效果如下 - `mobile`字段被加密,自定义密钥62进制的字典加密(仅支持数字和英文的加密,可支持加密后的模糊查询) - `addr`字段被加密,AES算法 - `other`字段为json,内容暂不支持加密,可自行根据此项目拓展,但json内容的接口响应可支持脱敏 ![img.png](images/img.png)