1. 代码优化

master
陈峰 1 year ago
parent 73bd09b9b4
commit 2b717426a7
  1. 3
      framework-core/pom.xml
  2. 35
      framework-core/src/main/java/com/unionmed/framework/crypto/AES.java
  3. 2
      framework-core/src/main/java/com/unionmed/framework/spring/mvc/ExceptionHandler.java
  4. 43
      framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/BodyCryptUtils.java
  5. 3
      framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/DecryptRequestBodyAdvice.java
  6. 5
      framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/EncryptionResponseBodyInterceptor.java
  7. 25
      framework-core/src/main/java/com/unionmed/framework/util/Generators.java
  8. 2
      framework-orm/pom.xml
  9. 2
      framework-test/pom.xml
  10. 8
      pom.xml

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.unionmed</groupId> <groupId>com.unionmed</groupId>
<artifactId>unionmed-framework</artifactId> <artifactId>unionmed-framework</artifactId>
<version>0.0.13</version> <version>0.0.14</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -168,7 +168,6 @@
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency> </dependency>
</dependencies> </dependencies>

@ -15,36 +15,57 @@ import java.io.UnsupportedEncodingException;
@Slf4j @Slf4j
public class AES { public class AES {
private static final String ALGORITHM = "AES"; private final static String CHARSET = "UTF-8";
private static final String PADDING = "AES/CBC/ISO10126Padding"; // AES/CBC/PKCS5PADDING 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 { 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 { try {
IvParameterSpec ivSpec = new IvParameterSpec(toUtf8Bytes(iv)); IvParameterSpec ivSpec = new IvParameterSpec(toUtf8Bytes(iv));
SecretKeySpec skSpec = new SecretKeySpec(toUtf8Bytes(sk), ALGORITHM); SecretKeySpec skSpec = new SecretKeySpec(toUtf8Bytes(sk), ALGORITHM);
Cipher cipher = Cipher.getInstance(PADDING); Cipher cipher = Cipher.getInstance(PADDING);
cipher.init(Cipher.ENCRYPT_MODE, skSpec, ivSpec); cipher.init(Cipher.ENCRYPT_MODE, skSpec, ivSpec);
return Base64.encodeBase64String(cipher.doFinal(toUtf8Bytes(value))); return cipher.doFinal(toUtf8Bytes(val));
} catch (Exception ex) { } catch (Exception ex) {
log.error("AES加密失败", ex); log.error("AES加密失败", ex);
return null; 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 { try {
IvParameterSpec ivSpec = new IvParameterSpec(toUtf8Bytes(iv)); IvParameterSpec ivSpec = new IvParameterSpec(toUtf8Bytes(iv));
SecretKeySpec skSpec = new SecretKeySpec(toUtf8Bytes(sk), ALGORITHM); SecretKeySpec skSpec = new SecretKeySpec(toUtf8Bytes(sk), ALGORITHM);
Cipher cipher = Cipher.getInstance(PADDING); Cipher cipher = Cipher.getInstance(PADDING);
cipher.init(Cipher.DECRYPT_MODE, skSpec, ivSpec); cipher.init(Cipher.DECRYPT_MODE, skSpec, ivSpec);
return new String(cipher.doFinal(Base64.decodeBase64(val))); return cipher.doFinal(Base64.decodeBase64(val));
} catch (Exception ex) { } catch (Exception ex) {
log.error("AES解密失败", ex); log.error("AES解密失败", ex);
return null; 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;
}
}
} }

@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
public class ExceptionHandler { public class ExceptionHandler {
@org.springframework.web.bind.annotation.ExceptionHandler(UmedException.class) @org.springframework.web.bind.annotation.ExceptionHandler(UmedException.class)
public BaseReturn umedException(UmedException e) { public Object umedException(UmedException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
return e.getRtn(); return e.getRtn();
} }

@ -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));
}
}

@ -1,7 +1,6 @@
package com.unionmed.framework.spring.mvc.response; package com.unionmed.framework.spring.mvc.response;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.unionmed.framework.crypto.AES;
import com.unionmed.framework.http.HttpHeaders; import com.unionmed.framework.http.HttpHeaders;
import com.unionmed.framework.util.ObjectUtils; import com.unionmed.framework.util.ObjectUtils;
import lombok.extern.slf4j.Slf4j; 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<? extends HttpMessageConverter<?>> converterType) throws IOException { public HttpInputMessage beforeBodyRead(final HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
String body = IOUtils.toString(inputMessage.getBody(), HttpHeaders.CHARSET_UTF8); 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)) { 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()) { if (log.isDebugEnabled()) {

@ -1,12 +1,11 @@
package com.unionmed.framework.spring.mvc.response.interceptor; package com.unionmed.framework.spring.mvc.response.interceptor;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.unionmed.framework.crypto.AES;
import com.unionmed.framework.http.HttpHeaders; import com.unionmed.framework.http.HttpHeaders;
import com.unionmed.framework.spring.mvc.BaseReturn; import com.unionmed.framework.spring.mvc.BaseReturn;
import com.unionmed.framework.spring.mvc.BaseReturnUtils; 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.spring.mvc.response.RequestResponseBodyCryptProperties;
import com.unionmed.framework.util.Generators; import com.unionmed.framework.util.Generators;
import com.unionmed.framework.util.ObjectUtils; import com.unionmed.framework.util.ObjectUtils;
@ -68,7 +67,7 @@ public class EncryptionResponseBodyInterceptor implements ResponseBodyIntercepto
return handleReturnValue(sk, iv, new JSONObject((Map<String, Object>) returnValue)); return handleReturnValue(sk, iv, new JSONObject((Map<String, Object>) returnValue));
} }
return iv + AES.encrypt(sk, iv, JSON.toJSONString(returnValue)); return BodyCryptUtils.encrypt(sk, iv, returnValue);
} }
@Override @Override

@ -20,8 +20,9 @@ public final class Generators {
public static String random(int length) { public static String random(int length) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
char a = 'a' - 10; char a = 'a' - 10;
Random random = new Random();
while (sb.length() < length) { while (sb.length() < length) {
int n = Math.abs(new Random().nextInt()) % 36; int n = Math.abs(random.nextInt()) % 36;
if (n < 10) if (n < 10)
n += '0'; n += '0';
else else
@ -34,20 +35,14 @@ public final class Generators {
public static String randomMix(int length) { public static String randomMix(int length) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
char a = 'a' - 10; char a = 'a' - 10, A = 'A' - 10;
Random mix = new Random(); Random random = new Random();
while (sb.length() < length) { while (sb.length() < length) {
int n = Math.abs(new Random().nextInt()) % 36; int n = Math.abs(random.nextInt()) % 36;
if (n < 10) if (n < 10)
n += '0'; n += '0';
else else
n += a; n += (n & 1) == 1 ? A : a;
if (n >= 97 && n <= 122) {
if (mix.nextInt(2) == 0) {
n -= 32;
}
}
sb.append((char) n); sb.append((char) n);
} }
@ -63,9 +58,9 @@ public final class Generators {
*/ */
public static String number(int length) { public static String number(int length) {
StringBuilder string = new StringBuilder(); StringBuilder string = new StringBuilder();
Random random = new Random();
while (string.length() < length) { while (string.length() < length) {
int n = Math.abs(new Random().nextInt()) % 10 + '0'; string.append((char) (Math.abs(random.nextInt()) % 10 + '0'));
string.append((char) n);
} }
return string.toString(); return string.toString();
@ -79,9 +74,9 @@ public final class Generators {
*/ */
public static String chars(int length) { public static String chars(int length) {
StringBuilder string = new StringBuilder(); StringBuilder string = new StringBuilder();
Random random = new Random();
while (string.length() < length) { while (string.length() < length) {
int n = Math.abs(new Random().nextInt()) % 26 + 'a'; string.append((char) (Math.abs(random.nextInt()) % 26 + 'a'));
string.append((char) n);
} }
return string.toString(); return string.toString();

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>unionmed-framework</artifactId> <artifactId>unionmed-framework</artifactId>
<groupId>com.unionmed</groupId> <groupId>com.unionmed</groupId>
<version>0.0.12</version> <version>0.0.14</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.unionmed</groupId> <groupId>com.unionmed</groupId>
<artifactId>unionmed-framework</artifactId> <artifactId>unionmed-framework</artifactId>
<version>0.0.12</version> <version>0.0.14</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

@ -9,7 +9,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.unionmed</groupId> <groupId>com.unionmed</groupId>
<artifactId>unionmed-framework</artifactId> <artifactId>unionmed-framework</artifactId>
<version>0.0.13</version> <version>0.0.14</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>unionmed-framework</name> <name>unionmed-framework</name>
@ -62,6 +62,7 @@
<rxnetty.version>0.4.9</rxnetty.version> <rxnetty.version>0.4.9</rxnetty.version>
<mksapi.version>4.10.9049</mksapi.version> <mksapi.version>4.10.9049</mksapi.version>
<bcprov.version>1.73</bcprov.version> <bcprov.version>1.73</bcprov.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<commons-io.version>2.6</commons-io.version> <commons-io.version>2.6</commons-io.version>
</properties> </properties>
@ -226,6 +227,11 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>${commons-io.version}</version> <version>${commons-io.version}</version>

Loading…
Cancel
Save