From f688f1570ede3f6e3226d1aee58bfeca368875b1 Mon Sep 17 00:00:00 2001 From: mayuanfei Date: Tue, 17 Jan 2023 17:31:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A6=82=E4=B8=8B=EF=BC=9A?= =?UTF-8?q?=201.=E6=B7=B1=E6=8B=B7=E8=B4=9D=E4=BF=AE=E6=94=B9=E4=B8=BAset?= =?UTF-8?q?=E5=BD=A2=E5=BC=8F=202.=E5=8A=A0=E5=AF=86=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E8=80=85=E4=BB=8E=E5=9F=BA=E7=B1=BB=E7=BB=A7=E6=89=BF=EF=BC=8C?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E6=9E=84=E9=80=A0=E6=96=B9=E6=B3=95=E5=B8=A6?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/encrypt/EncryptContext.java | 2 + .../com/ruoyi/common/encrypt/IEncryptor.java | 10 ----- .../framework/encrypt/EncryptorManager.java | 28 +++++++++++--- .../encrypt/encryptor/AbstractEncryptor.java | 16 ++++++++ .../encrypt/encryptor/AesEncryptor.java | 38 ++++++++----------- .../encrypt/encryptor/Base64Encryptor.java | 20 +++------- .../encrypt/encryptor/RsaEncryptor.java | 31 ++++++--------- .../encrypt/encryptor/Sm2Encryptor.java | 31 ++++++--------- .../encrypt/encryptor/Sm4Encryptor.java | 37 +++++++----------- 9 files changed, 97 insertions(+), 116 deletions(-) create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/AbstractEncryptor.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/encrypt/EncryptContext.java b/ruoyi-common/src/main/java/com/ruoyi/common/encrypt/EncryptContext.java index c74914095..2a1543ae8 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/encrypt/EncryptContext.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/encrypt/EncryptContext.java @@ -1,6 +1,7 @@ package com.ruoyi.common.encrypt; import com.ruoyi.common.enums.EncodeType; +import lombok.Builder; import lombok.Data; /** @@ -11,6 +12,7 @@ import lombok.Data; * @date 2023-01-17 08:31 */ @Data +@Builder public class EncryptContext { /** * 安全秘钥 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/encrypt/IEncryptor.java b/ruoyi-common/src/main/java/com/ruoyi/common/encrypt/IEncryptor.java index 946d55121..fae0327c1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/encrypt/IEncryptor.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/encrypt/IEncryptor.java @@ -20,16 +20,6 @@ public interface IEncryptor { */ AlgorithmType algorithm(); - /** - * 初始化加密者 - * - * @param context 加密上下文 - * @throws Exception 抛出异常 - * @author 老马 - * @date 2023/1/17 09:01 - */ - void init(EncryptContext context) throws Exception; - /** * 加密 * diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/EncryptorManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/EncryptorManager.java index bf9b1ddcd..aaa0105ea 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/EncryptorManager.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/EncryptorManager.java @@ -1,11 +1,12 @@ package com.ruoyi.framework.encrypt; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import com.ruoyi.common.encrypt.EncryptContext; import com.ruoyi.common.encrypt.IEncryptor; -import com.ruoyi.common.utils.BeanCopyUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.config.properties.EncryptorProperties; +import jodd.util.ClassLoaderUtil; import lombok.extern.slf4j.Slf4j; import java.util.Map; @@ -38,13 +39,22 @@ public class EncryptorManager { if (encryptorMap.containsKey(encryptorKey)) { return encryptorMap.get(encryptorKey); } - EncryptContext encryptContext = BeanCopyUtils.copy(properties, EncryptContext.class); - IEncryptor encryptor = ReflectUtil.newInstance(properties.getAlgorithm().getClazz()); + EncryptContext encryptContext = EncryptContext.builder() + .password(properties.getPassword()) + .privateKey(properties.getPrivateKey()) + .publicKey(properties.getPublicKey()) + .encode(properties.getEncode()) + .build(); + Class clazz = null; try { - encryptor.init(encryptContext); - } catch (Exception e) { - log.error("加密执行者注册失败。", e); + clazz = ClassLoaderUtil.loadClass(properties.getAlgorithm().getClazz()); + } catch (ClassNotFoundException e) { + log.error("没有找到配置中指定的加密执行者", e); } + if(ObjectUtil.isNull(clazz)) { + return null; + } + IEncryptor encryptor = ReflectUtil.newInstance(clazz, encryptContext); encryptorMap.put(encryptorKey, encryptor); return encryptorMap.get(encryptorKey); } @@ -72,6 +82,9 @@ public class EncryptorManager { public String encrypt(String value, EncryptorProperties properties) { try { IEncryptor encryptor = this.registAndGetEncryptor(properties); + if(ObjectUtil.isNull(encryptor)){ + return value; + } return encryptor.encrypt(value, properties.getEncode()); } catch (Exception e) { log.error("字段加密异常,原样返回", e); @@ -91,6 +104,9 @@ public class EncryptorManager { public String decrypt(String value, EncryptorProperties properties) { try { IEncryptor encryptor = this.registAndGetEncryptor(properties); + if(ObjectUtil.isNull(encryptor)){ + return value; + } return encryptor.decrypt(value, properties.getEncode()); } catch (Exception e) { log.error("字段解密异常,原样返回", e); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/AbstractEncryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/AbstractEncryptor.java new file mode 100644 index 000000000..16f898646 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/AbstractEncryptor.java @@ -0,0 +1,16 @@ +package com.ruoyi.framework.encrypt.encryptor; + +import com.ruoyi.common.encrypt.EncryptContext; +import com.ruoyi.common.encrypt.IEncryptor; + +/** + * 所有加密执行者的基类 + * + * @author 老马 + * @date 2023-01-17 16:52 + */ +public abstract class AbstractEncryptor implements IEncryptor { + public AbstractEncryptor(EncryptContext context) throws Exception{ + //子类必须实现带参数的构造方法 + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/AesEncryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/AesEncryptor.java index 8b343a559..8b52a60f2 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/AesEncryptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/AesEncryptor.java @@ -6,7 +6,6 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.AES; import com.ruoyi.common.encrypt.EncryptContext; -import com.ruoyi.common.encrypt.IEncryptor; import com.ruoyi.common.enums.AlgorithmType; import com.ruoyi.common.enums.EncodeType; @@ -18,10 +17,24 @@ import java.nio.charset.StandardCharsets; * @author 老马 * @date 2023-01-06 11:39 */ -public class AesEncryptor implements IEncryptor { +public class AesEncryptor extends AbstractEncryptor { private AES aes = null; + public AesEncryptor(EncryptContext context) throws Exception{ + super(context); + String password = context.getPassword(); + if (StrUtil.isBlank(password)) { + throw new RuntimeException("aes没有获得秘钥信息"); + } + // aes算法的秘钥要求是16位、24位、32位 + int[] array = {16, 24, 32}; + if(!ArrayUtil.contains(array, password.length())) { + throw new RuntimeException("aes秘钥长度应该为16位、24位、32位,实际为"+password.length()+"位"); + } + aes = SecureUtil.aes(context.getPassword().getBytes(StandardCharsets.UTF_8)); + } + /** * 获得当前算法 * @@ -34,27 +47,6 @@ public class AesEncryptor implements IEncryptor { return AlgorithmType.AES; } - /** - * 初始化加密者 - * - * @param context 加密上下文 - * @author 老马 - * @date 2023/1/17 09:01 - */ - @Override - public void init(EncryptContext context) throws Exception { - String password = context.getPassword(); - if (StrUtil.isBlank(password)) { - throw new RuntimeException("aes没有获得秘钥信息"); - } - // aes算法的秘钥要求是16位、24位、32位 - int[] array = {16, 24, 32}; - if(!ArrayUtil.contains(array, password.length())) { - throw new RuntimeException("aes秘钥长度应该为16位、24位、32位,实际为"+password.length()+"位"); - } - aes = SecureUtil.aes(context.getPassword().getBytes(StandardCharsets.UTF_8)); - } - /** * 加密 * diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Base64Encryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Base64Encryptor.java index 54b7a3ddd..34e895966 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Base64Encryptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Base64Encryptor.java @@ -2,7 +2,6 @@ package com.ruoyi.framework.encrypt.encryptor; import cn.hutool.core.codec.Base64; import com.ruoyi.common.encrypt.EncryptContext; -import com.ruoyi.common.encrypt.IEncryptor; import com.ruoyi.common.enums.AlgorithmType; import com.ruoyi.common.enums.EncodeType; @@ -12,7 +11,12 @@ import com.ruoyi.common.enums.EncodeType; * @author 老马 * @date 2023-01-06 10:00 */ -public class Base64Encryptor implements IEncryptor { +public class Base64Encryptor extends AbstractEncryptor { + + public Base64Encryptor(EncryptContext context) throws Exception { + super(context); + } + /** * 获得当前算法 * @@ -25,18 +29,6 @@ public class Base64Encryptor implements IEncryptor { return AlgorithmType.BASE64; } - /** - * 初始化加密者 - * - * @param context 加密上下文 - * @author 老马 - * @date 2023/1/17 09:01 - */ - @Override - public void init(EncryptContext context) { - // 无需初始化 - } - /** * 加密 * diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/RsaEncryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/RsaEncryptor.java index 573c9e809..a12af5a26 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/RsaEncryptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/RsaEncryptor.java @@ -6,7 +6,6 @@ import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.RSA; import com.ruoyi.common.encrypt.EncryptContext; -import com.ruoyi.common.encrypt.IEncryptor; import com.ruoyi.common.enums.AlgorithmType; import com.ruoyi.common.enums.EncodeType; import com.ruoyi.common.utils.StringUtils; @@ -18,10 +17,20 @@ import com.ruoyi.common.utils.StringUtils; * @author 老马 * @date 2023-01-06 09:37 */ -public class RsaEncryptor implements IEncryptor { +public class RsaEncryptor extends AbstractEncryptor { private RSA rsa = null; + public RsaEncryptor(EncryptContext context) throws Exception { + super(context); + String privateKey = context.getPrivateKey(); + String publicKey = context.getPublicKey(); + if (StringUtils.isAnyEmpty(privateKey, publicKey)) { + throw new RuntimeException("rsa公私钥均需要提供,公钥加密,私钥解密。"); + } + this.rsa = SecureUtil.rsa(Base64.decode(privateKey), Base64.decode(publicKey)); + } + /** * 获得当前算法 * @@ -34,24 +43,6 @@ public class RsaEncryptor implements IEncryptor { return AlgorithmType.RSA; } - /** - * 初始化加密者 - * - * @param context 加密上下文 - * @throws Exception 抛出异常 - * @author 老马 - * @date 2023/1/17 09:01 - */ - @Override - public void init(EncryptContext context) throws Exception { - String privateKey = context.getPrivateKey(); - String publicKey = context.getPublicKey(); - if (StringUtils.isAnyEmpty(privateKey, publicKey)) { - throw new RuntimeException("rsa公私钥均需要提供,公钥加密,私钥解密。"); - } - this.rsa = SecureUtil.rsa(Base64.decode(privateKey), Base64.decode(publicKey)); - } - /** * 加密 * diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Sm2Encryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Sm2Encryptor.java index 5ecae00bc..fbbe284c8 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Sm2Encryptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Sm2Encryptor.java @@ -7,7 +7,6 @@ import cn.hutool.crypto.SmUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.SM2; import com.ruoyi.common.encrypt.EncryptContext; -import com.ruoyi.common.encrypt.IEncryptor; import com.ruoyi.common.enums.AlgorithmType; import com.ruoyi.common.enums.EncodeType; import com.ruoyi.common.utils.StringUtils; @@ -18,10 +17,20 @@ import com.ruoyi.common.utils.StringUtils; * @author 老马 * @date 2023-01-06 17:13 */ -public class Sm2Encryptor implements IEncryptor { +public class Sm2Encryptor extends AbstractEncryptor { private SM2 sm2 = null; + public Sm2Encryptor(EncryptContext context) throws Exception { + super(context); + String privateKey = context.getPrivateKey(); + String publicKey = context.getPublicKey(); + if (StringUtils.isAnyEmpty(privateKey, publicKey)) { + throw new RuntimeException("sm2公私钥均需要提供,公钥加密,私钥解密。"); + } + this.sm2 = SmUtil.sm2(Base64.decode(privateKey), Base64.decode(publicKey)); + } + /** * 获得当前算法 * @@ -34,24 +43,6 @@ public class Sm2Encryptor implements IEncryptor { return AlgorithmType.SM2; } - /** - * 初始化加密者 - * - * @param context 加密上下文 - * @throws Exception 抛出异常 - * @author 老马 - * @date 2023/1/17 09:01 - */ - @Override - public void init(EncryptContext context) throws Exception { - String privateKey = context.getPrivateKey(); - String publicKey = context.getPublicKey(); - if (StringUtils.isAnyEmpty(privateKey, publicKey)) { - throw new RuntimeException("sm2公私钥均需要提供,公钥加密,私钥解密。"); - } - this.sm2 = SmUtil.sm2(Base64.decode(privateKey), Base64.decode(publicKey)); - } - /** * 加密 * diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Sm4Encryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Sm4Encryptor.java index 1b83a0464..e9b747f5b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Sm4Encryptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/encryptor/Sm4Encryptor.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SmUtil; import cn.hutool.crypto.symmetric.SM4; import com.ruoyi.common.encrypt.EncryptContext; -import com.ruoyi.common.encrypt.IEncryptor; import com.ruoyi.common.enums.AlgorithmType; import com.ruoyi.common.enums.EncodeType; @@ -17,10 +16,23 @@ import java.nio.charset.StandardCharsets; * @author 老马 * @date 2023-01-06 17:40 */ -public class Sm4Encryptor implements IEncryptor { +public class Sm4Encryptor extends AbstractEncryptor { private SM4 sm4 = null; + public Sm4Encryptor(EncryptContext context) throws Exception { + super(context); + String password = context.getPassword(); + if (StrUtil.isBlank(password)) { + throw new RuntimeException("sm4没有获得秘钥信息"); + } + // sm4算法的秘钥要求是16位长度 + if (16 != password.length()) { + throw new RuntimeException("sm4秘钥长度应该为16位,实际为" + password.length() + "位"); + } + this.sm4 = SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)); + } + /** * 获得当前算法 * @@ -33,27 +45,6 @@ public class Sm4Encryptor implements IEncryptor { return AlgorithmType.SM4; } - /** - * 初始化加密者 - * - * @param context 加密上下文 - * @throws Exception 抛出异常 - * @author 老马 - * @date 2023/1/17 09:01 - */ - @Override - public void init(EncryptContext context) throws Exception { - String password = context.getPassword(); - if (StrUtil.isBlank(password)) { - throw new RuntimeException("sm4没有获得秘钥信息"); - } - // sm4算法的秘钥要求是16位长度 - if (16 != password.length()) { - throw new RuntimeException("sm4秘钥长度应该为16位,实际为" + password.length() + "位"); - } - this.sm4 = SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)); - } - /** * 加密 *