publish 0.8.0

This commit is contained in:
曾文豪
2023-03-06 15:35:39 +08:00
parent c02e67f85f
commit 488c53def0
21 changed files with 211 additions and 190 deletions

View File

@@ -1,20 +1,21 @@
package com.tiesheng.encrypt;
import com.tiesheng.encrypt.config.EncryptConfig;
import com.tiesheng.encrypt.config.EncryptRequestBodyAdvice;
import com.tiesheng.encrypt.config.EncryptResponseBodyAdvice;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import java.lang.annotation.*;
/**
* @author hao
*/
@Configuration
@ComponentScan(basePackageClasses = {
EncryptConfig.class,
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({
EncryptRequestBodyAdvice.class,
EncryptResponseBodyAdvice.class,
})
public class EnableEncryptConfig {
public @interface EnableEncryptConfig {
}

View File

@@ -1,44 +0,0 @@
package com.tiesheng.encrypt.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author hao
*/
@Configuration
@ConfigurationProperties(prefix = "tiesheng.encrypt")
public class EncryptConfig {
public String publicD;
public String privateQ;
private boolean enable = false;
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
}
public String getPublicD() {
return publicD;
}
public void setPublicD(String publicD) {
this.publicD = publicD;
}
public String getPrivateQ() {
return privateQ;
}
public void setPrivateQ(String privateQ) {
this.privateQ = privateQ;
}
}

View File

@@ -3,13 +3,8 @@ package com.tiesheng.encrypt.config;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.ECKeyUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.json.JSONUtil;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import com.tiesheng.util.config.EncryptConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
@@ -42,12 +37,8 @@ public class EncryptRequestBodyAdvice implements RequestBodyAdvice {
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
if (!encryptConfig.isEnable()) {
return inputMessage;
}
try {
return new DecryptHttpInputMessage(inputMessage, encryptConfig.getPrivateQ());
return new DecryptHttpInputMessage(inputMessage, encryptConfig);
} catch (Exception ignore) {
}
@@ -72,16 +63,12 @@ public class EncryptRequestBodyAdvice implements RequestBodyAdvice {
private HttpHeaders headers;
private InputStream body;
DecryptHttpInputMessage(HttpInputMessage inputMessage, String privateQ) throws Exception {
DecryptHttpInputMessage(HttpInputMessage inputMessage, EncryptConfig encryptConfig) throws Exception {
this.headers = inputMessage.getHeaders();
String bodyStr = IoUtil.read(inputMessage.getBody(), CharsetUtil.CHARSET_UTF_8);
String encryptData = JSONUtil.parseObj(bodyStr).getStr("encryptData");
if (!StrUtil.isEmpty(encryptData)) {
// 部分语言加密之后缺少04前缀如果解密失败可尝试增加04
ECPrivateKeyParameters privateKeyParameters = ECKeyUtil.toSm2PrivateParams(privateQ);
ECPublicKeyParameters publicKeyParameters = ECKeyUtil.getPublicParams(privateKeyParameters);
SM2 sm2 = SmUtil.sm2(privateKeyParameters, publicKeyParameters);
String decrypt = sm2.decryptStr(encryptData, KeyType.PrivateKey);
String decrypt = encryptConfig.decrypt(encryptData);
this.body = IoUtil.toStream(decrypt, Charset.defaultCharset());
} else {
this.body = IoUtil.toStream(bodyStr, Charset.defaultCharset());

View File

@@ -2,16 +2,10 @@ package com.tiesheng.encrypt.config;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.ECKeyUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.log.LogFactory;
import com.tiesheng.annotation.encrypt.EncryptedRespBody;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import com.tiesheng.util.config.EncryptConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
@@ -19,6 +13,7 @@ import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@@ -33,22 +28,13 @@ public class EncryptResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
return AnnotationUtil.getAnnotation(returnType.getContainingClass(), RestController.class) != null;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends
HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (!encryptConfig.isEnable()) {
return body;
}
boolean encrypt = AnnotationUtil.getAnnotation(returnType.getContainingClass(), EncryptedRespBody.class) != null;
if (!encrypt) {
return body;
}
try {
String content = JSONUtil.toJsonStr(body);
@@ -62,12 +48,7 @@ public class EncryptResponseBodyAdvice implements ResponseBodyAdvice<Object> {
JSONObject resp = JSONUtil.parseObj(content);
resp.set("encrypted", true);
if (resp.getInt("code") == 200) {
// 用公钥进行加密
ECPrivateKeyParameters privateKeyParameters = ECKeyUtil.toSm2PrivateParams(encryptConfig.getPrivateQ());
ECPublicKeyParameters publicKeyParameters = ECKeyUtil.getPublicParams(privateKeyParameters);
SM2 sm2 = SmUtil.sm2(privateKeyParameters, publicKeyParameters);
String decrypt = sm2.encryptHex(respData, KeyType.PublicKey);
resp.set("data", decrypt.substring(2));
resp.set("data", encryptConfig.encrypt(respData));
}
return resp;
} catch (Exception var17) {