Skip to content
广告❤️成为赞助商

字段加密解密

注解@FieldEncrypt实现数据加解密,内置MD5BASE64AESRSA等多种加密算法

@FieldEncrypt

  • 数据加解密注解
  • algorithm(): 加密类型,默认为Base64
  • findDecrypt(): 查询是否解密 如果设置为false,那么在查询时不会进行解密
  • key(): 对称加密秘钥,优先于全局参数
  • privateKey() 非对称加密私钥,优先于全局参数
  • publicKey() 非对称加密公钥,优先于全局参数
  • encryptor() 加密处理器,需实现com.anwen.mongo.encryptor.Encryptor接口

AlgorithmEnum加密类型

算法描述
MD5_3232位MD5算法
MD5_1616位MD5算法
BASE6464个字符来表示任意二进制数据算法
AESAES对称算法
RSA非对称加密算法
SM2国密SM2非对称加密算法,基于ECC
SM3国密SM3消息摘要算法,可以用MD5作为对比理解
SM4国密SM4对称加密算法,无线局域网标准的分组数据算法
PBEWithMD5AndDES混合算法
PBEWithMD5AndTripleDES混合算法
PBEWithSHA1AndDESede混合算法
PBEWithSHA1AndRC2_40混合算法

警告:

不支持以及不赞成在 RPC 调用中把 QueryChainWrapper 进行传输

  1. MD5 算法为不可逆算法,存储数据库及查询结果都是密文。
  2. SM2、3、4 算法必须依赖 bouncycastle 加密库

SM2、3、4所需依赖

xml
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk18on</artifactId>
    <version>1.78.1</version>
</dependency>

GenerateKeyUtil生成秘钥工具类

java
public static void main(String[] args) {
    try {
        // 生成AES秘钥
        String aesKey = GenerateKeyUtil.generateAESKey("123456");
        // 生成RSA公钥和私钥
        MutablePair<String, String> rsaKey = GenerateKeyUtil.generateRSAKey();
        // 生成SM2秘钥
        MutablePair<String, String> sm2Key = GenerateKeyUtil.generateSM2Key();
        // 生成SM4秘钥
        String sm4Key = GenerateKeyUtil.generateSM4Key();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

示例

全局配置示例

yml
mongo-plus:
    encryptor:
        key: XXXXXXXXXXXX
        public-key: XXXXXXXXXXXXXXXXXXXXXXX
        private-key: XXXXXXXXXXXXXXXXXXXXXXX

实体类数据加解密

java
public class User{
    @FieldEncrypt(key = "",publicKey = "",privateKey = "")
    private String userName;
}

自定义加解密处理器

java
public class CustomEncryptor implements Encryptor {
    @Override
    public String encrypt(String data, String key, String publicKey) throws Exception {
        return data;
    }

    @Override
    public String decrypt(String data, String key, String privateKey) throws Exception {
        return data;
    }
}
//实体类使用
public class User{
    @FieldEncrypt(key = "",publicKey = "",privateKey = "",encryptor = CustomEncryptor.class)
    private String userName;
}