From 2b717426a754a3d3f8f0280538f4194dc139b22e Mon Sep 17 00:00:00 2001 From: chenfeng <694447355@qq.com> Date: Tue, 27 Jun 2023 15:01:19 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework-core/pom.xml | 3 +- .../java/com/unionmed/framework/crypto/AES.java | 35 ++++++++++++++---- .../framework/spring/mvc/ExceptionHandler.java | 2 +- .../spring/mvc/response/BodyCryptUtils.java | 43 ++++++++++++++++++++++ .../mvc/response/DecryptRequestBodyAdvice.java | 3 +- .../EncryptionResponseBodyInterceptor.java | 5 +-- .../com/unionmed/framework/util/Generators.java | 25 +++++-------- framework-orm/pom.xml | 2 +- framework-test/pom.xml | 2 +- pom.xml | 8 +++- 10 files changed, 95 insertions(+), 33 deletions(-) create mode 100644 framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/BodyCryptUtils.java diff --git a/framework-core/pom.xml b/framework-core/pom.xml index 1d10bf3..a601fb9 100644 --- a/framework-core/pom.xml +++ b/framework-core/pom.xml @@ -5,7 +5,7 @@ com.unionmed unionmed-framework - 0.0.13 + 0.0.14 4.0.0 @@ -168,7 +168,6 @@ org.apache.commons commons-lang3 - 3.12.0 diff --git a/framework-core/src/main/java/com/unionmed/framework/crypto/AES.java b/framework-core/src/main/java/com/unionmed/framework/crypto/AES.java index 9101b03..a1155e1 100644 --- a/framework-core/src/main/java/com/unionmed/framework/crypto/AES.java +++ b/framework-core/src/main/java/com/unionmed/framework/crypto/AES.java @@ -15,36 +15,57 @@ import java.io.UnsupportedEncodingException; @Slf4j public class AES { - private static final String ALGORITHM = "AES"; - private static final String PADDING = "AES/CBC/ISO10126Padding"; // AES/CBC/PKCS5PADDING + private final static String CHARSET = "UTF-8"; + private final static String ALGORITHM = "AES"; + private final static String PADDING = "AES/CBC/ISO10126Padding"; // AES/CBC/PKCS5PADDING private static byte[] toUtf8Bytes(String s) throws UnsupportedEncodingException { - return s.getBytes("UTF-8"); + return s.getBytes(CHARSET); } - public static String encrypt(String sk, String iv, String value) { + public static byte[] encrypt(String sk, String iv, String val) { try { IvParameterSpec ivSpec = new IvParameterSpec(toUtf8Bytes(iv)); SecretKeySpec skSpec = new SecretKeySpec(toUtf8Bytes(sk), ALGORITHM); Cipher cipher = Cipher.getInstance(PADDING); cipher.init(Cipher.ENCRYPT_MODE, skSpec, ivSpec); - return Base64.encodeBase64String(cipher.doFinal(toUtf8Bytes(value))); + return cipher.doFinal(toUtf8Bytes(val)); } catch (Exception ex) { log.error("AES加密失败", ex); return null; } } - public static String decrypt(String sk, String iv, String val) { + public static String encryptBase64String(String sk, String iv, String val) { + byte[] bytes = encrypt(sk, iv, val); + return bytes == null ? null : Base64.encodeBase64String(bytes); + } + + public static byte[] decrypt(String sk, String iv, String val) { try { IvParameterSpec ivSpec = new IvParameterSpec(toUtf8Bytes(iv)); SecretKeySpec skSpec = new SecretKeySpec(toUtf8Bytes(sk), ALGORITHM); Cipher cipher = Cipher.getInstance(PADDING); cipher.init(Cipher.DECRYPT_MODE, skSpec, ivSpec); - return new String(cipher.doFinal(Base64.decodeBase64(val))); + return cipher.doFinal(Base64.decodeBase64(val)); } catch (Exception ex) { log.error("AES解密失败", ex); return null; } } + + public static String decryptString(String sk, String iv, String val) { + byte[] bytes = decrypt(sk, iv, val); + return bytes == null ? null : new String(bytes); + } + + public static String decryptString(String sk, String iv, String val, String charset) { + byte[] bytes = encrypt(sk, iv, val); + try { + return bytes == null ? null : new String(bytes, charset); + } catch (UnsupportedEncodingException e) { + log.error("字符集编码异常", e); + return null; + } + } } diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ExceptionHandler.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ExceptionHandler.java index e0495cb..060b935 100644 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ExceptionHandler.java +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ExceptionHandler.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; public class ExceptionHandler { @org.springframework.web.bind.annotation.ExceptionHandler(UmedException.class) - public BaseReturn umedException(UmedException e) { + public Object umedException(UmedException e) { log.error(e.getMessage(), e); return e.getRtn(); } diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/BodyCryptUtils.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/BodyCryptUtils.java new file mode 100644 index 0000000..0825edf --- /dev/null +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/BodyCryptUtils.java @@ -0,0 +1,43 @@ +package com.unionmed.framework.spring.mvc.response; + +import com.alibaba.fastjson.JSON; +import com.unionmed.framework.crypto.AES; +import com.unionmed.framework.util.Converter; + +import java.util.Date; + +/** + * @author ianChen + * @date 2023/6/27 14:33 + */ +public final class BodyCryptUtils { + + private static boolean isBasicType(Class clazz) { + return clazz == int.class + || clazz == Integer.class + || clazz == long.class + || clazz == Long.class + || clazz == short.class + || clazz == Short.class + || clazz == char.class + || clazz == Character.class + || clazz == byte.class + || clazz == Byte.class + || clazz == boolean.class + || clazz == Boolean.class + || clazz == float.class + || clazz == Float.class + || clazz == double.class + || clazz == Double.class + || CharSequence.class.isAssignableFrom(clazz) + || Date.class.isAssignableFrom(clazz); + } + + public static String encrypt(String sk, String iv, Object body) { + return iv + AES.encryptBase64String(sk, iv, isBasicType(body.getClass()) ? Converter.toString(body) : JSON.toJSONString(body)); + } + + public static String decrypt(String sk, String body) { + return AES.decryptString(sk, body.substring(0, 16), body.substring(16)); + } +} diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/DecryptRequestBodyAdvice.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/DecryptRequestBodyAdvice.java index b6a6fd2..6379938 100644 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/DecryptRequestBodyAdvice.java +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/DecryptRequestBodyAdvice.java @@ -1,7 +1,6 @@ package com.unionmed.framework.spring.mvc.response; import com.alibaba.fastjson.JSON; -import com.unionmed.framework.crypto.AES; import com.unionmed.framework.http.HttpHeaders; import com.unionmed.framework.util.ObjectUtils; import lombok.extern.slf4j.Slf4j; @@ -39,7 +38,7 @@ public class DecryptRequestBodyAdvice implements RequestBodyAdvice { public HttpInputMessage beforeBodyRead(final HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) throws IOException { String body = IOUtils.toString(inputMessage.getBody(), HttpHeaders.CHARSET_UTF8); if (ObjectUtils.notEmpty(body) && requestResponseBodyCryptProperties.isEnabled() && ObjectUtils.equalsIgnore(inputMessage.getHeaders().getFirst(HttpHeaders.X_DATA_CRYPT_E), HttpHeaders.X_DATA_CRYPT_E_VALUE_TRUE)) { - body = AES.decrypt(requestResponseBodyCryptProperties.getSk(), body.substring(0, 16), body.substring(16)); + body = BodyCryptUtils.decrypt(requestResponseBodyCryptProperties.getSk(), body); } if (log.isDebugEnabled()) { diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/EncryptionResponseBodyInterceptor.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/EncryptionResponseBodyInterceptor.java index 07c17a2..40877d4 100644 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/EncryptionResponseBodyInterceptor.java +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/EncryptionResponseBodyInterceptor.java @@ -1,12 +1,11 @@ package com.unionmed.framework.spring.mvc.response.interceptor; import cn.hutool.json.JSONUtil; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.unionmed.framework.crypto.AES; import com.unionmed.framework.http.HttpHeaders; import com.unionmed.framework.spring.mvc.BaseReturn; import com.unionmed.framework.spring.mvc.BaseReturnUtils; +import com.unionmed.framework.spring.mvc.response.BodyCryptUtils; import com.unionmed.framework.spring.mvc.response.RequestResponseBodyCryptProperties; import com.unionmed.framework.util.Generators; import com.unionmed.framework.util.ObjectUtils; @@ -68,7 +67,7 @@ public class EncryptionResponseBodyInterceptor implements ResponseBodyIntercepto return handleReturnValue(sk, iv, new JSONObject((Map) returnValue)); } - return iv + AES.encrypt(sk, iv, JSON.toJSONString(returnValue)); + return BodyCryptUtils.encrypt(sk, iv, returnValue); } @Override diff --git a/framework-core/src/main/java/com/unionmed/framework/util/Generators.java b/framework-core/src/main/java/com/unionmed/framework/util/Generators.java index c58b031..e688287 100644 --- a/framework-core/src/main/java/com/unionmed/framework/util/Generators.java +++ b/framework-core/src/main/java/com/unionmed/framework/util/Generators.java @@ -20,8 +20,9 @@ public final class Generators { public static String random(int length) { StringBuilder sb = new StringBuilder(); char a = 'a' - 10; + Random random = new Random(); while (sb.length() < length) { - int n = Math.abs(new Random().nextInt()) % 36; + int n = Math.abs(random.nextInt()) % 36; if (n < 10) n += '0'; else @@ -34,20 +35,14 @@ public final class Generators { public static String randomMix(int length) { StringBuilder sb = new StringBuilder(); - char a = 'a' - 10; - Random mix = new Random(); + char a = 'a' - 10, A = 'A' - 10; + Random random = new Random(); while (sb.length() < length) { - int n = Math.abs(new Random().nextInt()) % 36; + int n = Math.abs(random.nextInt()) % 36; if (n < 10) n += '0'; else - n += a; - - if (n >= 97 && n <= 122) { - if (mix.nextInt(2) == 0) { - n -= 32; - } - } + n += (n & 1) == 1 ? A : a; sb.append((char) n); } @@ -63,9 +58,9 @@ public final class Generators { */ public static String number(int length) { StringBuilder string = new StringBuilder(); + Random random = new Random(); while (string.length() < length) { - int n = Math.abs(new Random().nextInt()) % 10 + '0'; - string.append((char) n); + string.append((char) (Math.abs(random.nextInt()) % 10 + '0')); } return string.toString(); @@ -79,9 +74,9 @@ public final class Generators { */ public static String chars(int length) { StringBuilder string = new StringBuilder(); + Random random = new Random(); while (string.length() < length) { - int n = Math.abs(new Random().nextInt()) % 26 + 'a'; - string.append((char) n); + string.append((char) (Math.abs(random.nextInt()) % 26 + 'a')); } return string.toString(); diff --git a/framework-orm/pom.xml b/framework-orm/pom.xml index 8cce697..d56e485 100644 --- a/framework-orm/pom.xml +++ b/framework-orm/pom.xml @@ -5,7 +5,7 @@ unionmed-framework com.unionmed - 0.0.12 + 0.0.14 4.0.0 diff --git a/framework-test/pom.xml b/framework-test/pom.xml index 97c648c..073f469 100644 --- a/framework-test/pom.xml +++ b/framework-test/pom.xml @@ -5,7 +5,7 @@ com.unionmed unionmed-framework - 0.0.12 + 0.0.14 4.0.0 diff --git a/pom.xml b/pom.xml index d1b2b17..771ea65 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 com.unionmed unionmed-framework - 0.0.13 + 0.0.14 pom unionmed-framework @@ -62,6 +62,7 @@ 0.4.9 4.10.9049 1.73 + 3.12.0 2.6 @@ -226,6 +227,11 @@ + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + commons-io commons-io ${commons-io.version}