# learn-encrypt-plugin **Repository Path**: shure/learn-encrypt-plugin ## Basic Information - **Project Name**: learn-encrypt-plugin - **Description**: 基于Mybatis的数据加解密插件,利用Mybatis的拦截器在数据入库和出库时做处理 - **Primary Language**: Java - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-04-29 - **Last Updated**: 2024-04-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 简介 基于Mybatis的数据加解密插件,利用Mybatis的拦截器在数据入库和出库时做加解密处理,提供了注解方式和配置方式两种。 新增了数据脱敏的功能,支持对字段进行脱敏处理后返回给前端。 ## 存储加解密使用 ### 1. 注解方式 在实体类和字段上添加`@EncryptDecryptClass`和`@EncryptDecryptField`注解,保存时自动加密添加注解的字段,查询时自动解密,业务无感知。 ```java @Data @Accessors(chain = true) @TableName("test_student") @EncryptDecryptClass public class TestStudent extends BaseEntity { //主键 @TableId(type = IdType.AUTO) private Long sid; //学生姓名 @EncryptDecryptField private String name; //性别 private Integer sex; //邮箱 @EncryptDecryptField private String email; } ``` ### 2. 配置方式 使用配置方式,添加以下配置: ```yml encrypt: entities: - name: com.shure.encrypt.entity.TestStudent fields: address,name ``` ### 加密后的效果 | name | email | address | phone | id_card | |------|------------------|---------|-------------|--------------------| | 李四 | ㎙㍑㎛㎐㎦㎣㎔㎟㎙㍳㎤㎤㍑㎖㎒㎐ | 甘肃省兰州市 | ㍤㍫㍤㍪㍫㍪㍫㍩㍪㍩㍨ | ㍩㍥㍣㍤㍥㍦㍤㍬㍫㍪㍣㍥㍦㍣㍥㍧㍦㍧ | | 张三 | ㎙㍑㎛㎐㎦㎣㎔㎟㎙㍳㎤㎤㍑㎖㎒㎐ | 甘肃省兰州市 | ㍤㍫㍤㍪㍫㍪㍫㍩㍪㍩㍨ | ㍩㍥㍣㍤㍥㍦㍤㍬㍫㍪㍣㍥㍦㍣㍥㍧㍦㍧ | ### 查询解密效果 ```json [ { "sid": 5, "name": "张三", "email": "f.hmspalf@qq.com", "address": "甘肃省兰州市", "phone": "18178786765", "idCard": "620123198702302434" }, { "name": "李四", "email": "f.hmspalf@qq.com", "address": "甘肃省兰州市", "phone": "18178786765", "idCard": "620123198702302434" } ] ``` ## 脱敏使用 在需要进行脱敏的实体字段上添加注解 `@Desensitization` 指定字段的类型,例如: ```java @Data @TableName("test_student") public class TestStudent extends BaseEntity { @TableId(type = IdType.INPUT) private String sid; private String name; private Integer sex; @Desensitization(type = DesensitizationEnum.EMAIL) private String email; @Desensitization(type = DesensitizationEnum.PHONE) private String phone; @Desensitization(type = DesensitizationEnum.CUSTOM_RULE, start = 2, end = 2) private String address; @Desensitization(type = DesensitizationEnum.ID_CARD_NO) private String idCard; } ``` 如果存在不脱敏的业务,如信息编辑时的查询,可以在对应接口处添加 `@IgnoreDesensitization` 注解,表示不脱敏,或者在接口返回处添加 `DesensitizeTransfer.skipSensitive();` ```java @GetMapping("stu/find") @IgnoreDesensitize public R find(String sid) { return Result.success(service.getById(sid)); } // 或 @GetMapping("stu/find") public R find(String sid) { DesensitizeTransfer.skipSensitive(); return Result.success(service.getById(sid)); } ``` ### 脱敏效果 ```json { "createBy": "", "createTime": "2023-10-17 15:12:37", "sid": "10", "name": "王小天", "sex": 24, "email": "n********@qq.com", "phone": "181****3345", "address": "安徽*****白县", "idCard": "62************2434" } ```