字段加密解密
注解
@FieldEncrypt
实现数据加解密,内置MD5
、BASE64
、AES
、RSA
等多种加密算法
@FieldEncrypt
- 数据加解密注解
- algorithm(): 加密类型,默认为Base64
- findDecrypt(): 查询是否解密 如果设置为false,那么在查询时不会进行解密
- key(): 对称加密秘钥,优先于全局参数
- privateKey() 非对称加密私钥,优先于全局参数
- publicKey() 非对称加密公钥,优先于全局参数
- encryptor() 加密处理器,需实现com.anwen.mongo.encryptor.Encryptor接口
AlgorithmEnum加密类型
算法 | 描述 |
---|---|
MD5_32 | 32位MD5算法 |
MD5_16 | 16位MD5算法 |
BASE64 | 64个字符来表示任意二进制数据算法 |
AES | AES对称算法 |
RSA | 非对称加密算法 |
SM2 | 国密SM2非对称加密算法,基于ECC |
SM3 | 国密SM3消息摘要算法,可以用MD5作为对比理解 |
SM4 | 国密SM4对称加密算法,无线局域网标准的分组数据算法 |
PBEWithMD5AndDES | 混合算法 |
PBEWithMD5AndTripleDES | 混合算法 |
PBEWithSHA1AndDESede | 混合算法 |
PBEWithSHA1AndRC2_40 | 混合算法 |
警告:
不支持以及不赞成在 RPC 调用中把 QueryChainWrapper 进行传输
- MD5 算法为不可逆算法,存储数据库及查询结果都是密文。
- 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;
}