# mybatis-interceptor-demo **Repository Path**: Wananme/mybatis-interceptor-demo ## Basic Information - **Project Name**: mybatis-interceptor-demo - **Description**: 基于mybatis拦截器实现数据入库加密/出库解密操作 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 8 - **Created**: 2022-07-10 - **Last Updated**: 2025-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: Spring, SpringBoot, MyBatis ## README ### 1. 注解说明 ​ 作用:在数据入库时进行加密,在数据出库时进行解密,不明文存储数据,增强数据的安全性。 #### @CryptEntity ​ 该注解仅能修饰接口、类、枚举。 ​ 该注解在使用Mybatis进行增删改查时生效,不影响数据在Controller和Service中进行业务逻辑处理。 ```java @Documented @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface CryptEntity { } ``` #### @CryptField ​ 该注解仅能修饰成员变量。 ​ 该注解在使用Mybatis进行增删改查时生效,不影响数据在Controller和Service中进行业务逻辑处理。 ```java @Documented @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface CryptField { /** * 加密枚举类型:AES/Base64 ... */ EncryptTypeEnum type(); } ``` ### 2. 注解使用 ​ @CryptEntity注解修饰类,@CryptField注解修饰成员变量同时需指定数据加密类型,当前支持**对称**和**Base64**加解密。 ​ @CryptEntity和@CryptField必须一起使用功能才生效。 ```java @CryptEntity public class DataMasking implements Serializable { /** * base64加解密 */ @CryptField(type = EncryptTypeEnum.BASE64) @ApiModelProperty("base64加解密") @TableField(value = "base64") private String base64; /** * 对称加密 */ @CryptField(type = EncryptTypeEnum.AES) @ApiModelProperty("对称加密") private String sea; } ``` ### 3. 拓展 ​ 支持拓展加密类型,具体步骤如下: ​ ①添加枚举类型 ```java /** * 加密类型枚举 **/ public enum EncryptTypeEnum { /** * AES加密 */ AES, /** * base64加密 */ BASE64, /** * xxxx加密 */ xxxx, } ``` ​ ②实现Crypt接口,重写加密解密方法 ```java /** * 加密算法接口定义 新增加密算法实现该接口即可 **/ public interface Crypt { /** * 加密 * @param plain 原始明文 * @return 密文 */ String encrypt(String plain); /** * 解密 * @param cipher 密文 * @return 原始明文 */ String decrypt(String cipher); } ``` ③将加密方式添加到加密实现类加载器中。 ```java /** * 加密实现类加载器(当前已有AES BASE64两种方式) * 后续如果有新增 需要同步添加 **/ @Component public class CryptLoader { /** * 加载所有加密方式实现类 */ public CryptLoader() { CryptContext.setCrypt(EncryptTypeEnum.AES, new AESCryptImpl()); CryptContext.setCrypt(EncryptTypeEnum.BASE64, new Base64CryptImpl()); CryptContext.setCrypt(EncryptTypeEnum.BASE64, new XXXXCryptImpl()); } } ``` ### 4. 注意事项 ​ 由于在数据库内存储的数据为加密后的数据,如需对被加密字段进行匹配检索时,有如下注意事项: 1. 不支持模糊查询,仅支持精确查询, 2. 不支持Mybatis自带的QueryWrapper方法,仅支持自定义mapper及xml, 3. 必须使用已添加CryptEntity和CryptField注解的实体类或自定义类作为参数, 4. 在mapper中必须使用@Param注解将参数名称映射为"crypt",如下: ```java DataMasking selectById(@Param("crypt")DataMasking dataMasking); ```