mirror of
https://gitee.com/incloudcode/yexuejc-springboot.git
synced 2026-03-10 06:50:05 +08:00
1.0.7
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
package com.yexuejc.springboot.base.filter;
|
||||
|
||||
import com.yexuejc.base.encrypt.RSA;
|
||||
import com.yexuejc.base.encrypt.RSA2;
|
||||
import com.yexuejc.base.pojo.ParamsPO;
|
||||
import com.yexuejc.base.util.JsonUtil;
|
||||
import com.yexuejc.base.util.StrUtil;
|
||||
import com.yexuejc.springboot.base.exception.GatewayException;
|
||||
import com.yexuejc.springboot.base.util.LogUtil;
|
||||
import com.yexuejc.springboot.base.util.RSA;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.core.MethodParameter;
|
||||
@@ -18,10 +19,7 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.Type;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.security.interfaces.RSAPrivateKey;
|
||||
|
||||
/**
|
||||
* 请求数据解密
|
||||
@@ -59,10 +57,19 @@ public class ParamsRequestBodyAdvice implements RequestBodyAdvice {
|
||||
//RSA解密
|
||||
try {
|
||||
long t = System.currentTimeMillis();
|
||||
RSAPrivateKey rsaPrivateKey = null;
|
||||
if (StrUtil.isEmpty(properties.getPrivateKey())) {
|
||||
rsaPrivateKey = RSA2.getPrivateKey(
|
||||
this.getClass().getResource(properties.getPrivateKeyPath()).getFile().toString(),
|
||||
properties.getPrivateAlias(),
|
||||
properties.getPrivatePwd());
|
||||
} else {
|
||||
rsaPrivateKey = RSA.getPrivateKey(properties.getPrivateKey());
|
||||
}
|
||||
String data = new String(
|
||||
RSA.privateDecrypt(
|
||||
paramsPO.getData(),
|
||||
RSA.getPrivateKey(properties.getPrivateKey())
|
||||
rsaPrivateKey
|
||||
)
|
||||
);
|
||||
//md5 校验
|
||||
@@ -73,15 +80,9 @@ public class ParamsRequestBodyAdvice implements RequestBodyAdvice {
|
||||
InputStream body = IOUtils.toInputStream(JsonUtil.obj2Json(StrUtil.parseUrlencoded(data)), "UTF-8");
|
||||
LogUtil.accessLogger.info("解密耗时:{}", System.currentTimeMillis() - t);
|
||||
return new MyHttpInputMessage(inputMessage.getHeaders(), body);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
throw new GatewayException("data错误");
|
||||
} catch (InvalidKeySpecException e) {
|
||||
e.printStackTrace();
|
||||
throw new GatewayException("data错误");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new GatewayException("data错误");
|
||||
LogUtil.accessLogger.error("解密失败,直接传递参数{}。\n异常信息:{}", JsonUtil.obj2Json(paramsPO), e);
|
||||
}
|
||||
}
|
||||
return inputMessage;
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package com.yexuejc.springboot.base.filter;
|
||||
|
||||
import com.yexuejc.base.encrypt.RSA;
|
||||
import com.yexuejc.base.encrypt.RSA2;
|
||||
import com.yexuejc.base.http.Resps;
|
||||
import com.yexuejc.base.util.JsonUtil;
|
||||
import com.yexuejc.base.util.StrUtil;
|
||||
import com.yexuejc.springboot.base.util.LogUtil;
|
||||
import com.yexuejc.springboot.base.util.RSA;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.http.MediaType;
|
||||
@@ -13,8 +14,7 @@ import org.springframework.http.server.ServerHttpResponse;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
|
||||
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.security.interfaces.RSAPrivateKey;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -69,13 +69,19 @@ public class ParamsResponseBodyAdvice implements ResponseBodyAdvice {
|
||||
}
|
||||
resps.setSign(StrUtil.toMD5(data));
|
||||
try {
|
||||
RSAPrivateKey rsaPrivateKey = null;
|
||||
if (StrUtil.isEmpty(properties.getPrivateKey())) {
|
||||
rsaPrivateKey = RSA2.getPrivateKey(
|
||||
this.getClass().getResource(properties.getPrivateKeyPath()).getFile().toString(),
|
||||
properties.getPrivateAlias(),
|
||||
properties.getPrivatePwd());
|
||||
} else {
|
||||
rsaPrivateKey = RSA.getPrivateKey(properties.getPrivateKey());
|
||||
}
|
||||
resps.setData(
|
||||
RSA.privateEncrypt(JsonUtil.obj2Json(resps.getData()), RSA.getPrivateKey(properties.getPrivateKey()))
|
||||
RSA.privateEncrypt(JsonUtil.obj2Json(resps.getData()), rsaPrivateKey)
|
||||
);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
LogUtil.accessLogger.error("出参加密错误,进行明文出参{}。\n异常信息:{}", JsonUtil.obj2Json(resps), e.getMessage());
|
||||
} catch (InvalidKeySpecException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
LogUtil.accessLogger.error("出参加密错误,进行明文出参{}。\n异常信息:{}", JsonUtil.obj2Json(resps), e.getMessage());
|
||||
}
|
||||
|
||||
@@ -16,10 +16,27 @@ public class RsaProperties {
|
||||
* 私钥
|
||||
*/
|
||||
private String privateKey = "";
|
||||
/**
|
||||
* 私钥证书路径:默认private.keystore
|
||||
*/
|
||||
private String privateKeyPath = "/private.keystore";
|
||||
/**
|
||||
* 私钥证书别名
|
||||
*/
|
||||
private String privateAlias = "alias";
|
||||
/**
|
||||
* 私钥证书密码
|
||||
*/
|
||||
private String privatePwd = "password";
|
||||
/**
|
||||
* 公钥
|
||||
*/
|
||||
private String publicKey = "";
|
||||
/**
|
||||
* 公钥证书路径:默认public.cer
|
||||
*/
|
||||
private String publicKeyPath = "/public.cer";
|
||||
|
||||
/**
|
||||
* 是否解密
|
||||
*/
|
||||
@@ -42,6 +59,38 @@ public class RsaProperties {
|
||||
this.decrypt = decrypt;
|
||||
}
|
||||
|
||||
public String getPrivateKeyPath() {
|
||||
return privateKeyPath;
|
||||
}
|
||||
|
||||
public void setPrivateKeyPath(String privateKeyPath) {
|
||||
this.privateKeyPath = privateKeyPath;
|
||||
}
|
||||
|
||||
public String getPrivateAlias() {
|
||||
return privateAlias;
|
||||
}
|
||||
|
||||
public void setPrivateAlias(String privateAlias) {
|
||||
this.privateAlias = privateAlias;
|
||||
}
|
||||
|
||||
public String getPrivatePwd() {
|
||||
return privatePwd;
|
||||
}
|
||||
|
||||
public void setPrivatePwd(String privatePwd) {
|
||||
this.privatePwd = privatePwd;
|
||||
}
|
||||
|
||||
public String getPublicKeyPath() {
|
||||
return publicKeyPath;
|
||||
}
|
||||
|
||||
public void setPublicKeyPath(String publicKeyPath) {
|
||||
this.publicKeyPath = publicKeyPath;
|
||||
}
|
||||
|
||||
public boolean isEncrypt() {
|
||||
return encrypt;
|
||||
}
|
||||
|
||||
@@ -1,177 +0,0 @@
|
||||
package com.yexuejc.springboot.base.util;
|
||||
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.tomcat.util.http.fileupload.IOUtils;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.security.*;
|
||||
import java.security.interfaces.RSAPrivateKey;
|
||||
import java.security.interfaces.RSAPublicKey;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.security.spec.PKCS8EncodedKeySpec;
|
||||
import java.security.spec.X509EncodedKeySpec;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class RSA {
|
||||
|
||||
public static final String CHARSET = "UTF-8";
|
||||
public static final String RSA_ALGORITHM = "RSA";
|
||||
|
||||
public static Map<String, String> initKeys(int keySize) {
|
||||
//为RSA算法创建一个KeyPairGenerator对象
|
||||
KeyPairGenerator kpg;
|
||||
try {
|
||||
kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]");
|
||||
}
|
||||
|
||||
//初始化KeyPairGenerator对象,密钥长度
|
||||
kpg.initialize(keySize);
|
||||
//生成密匙对
|
||||
KeyPair keyPair = kpg.generateKeyPair();
|
||||
//得到公钥
|
||||
Key publicKey = keyPair.getPublic();
|
||||
String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded());
|
||||
//得到私钥
|
||||
Key privateKey = keyPair.getPrivate();
|
||||
String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded());
|
||||
Map<String, String> keyPairMap = new HashMap<String, String>();
|
||||
keyPairMap.put("publicKey", publicKeyStr);
|
||||
keyPairMap.put("privateKey", privateKeyStr);
|
||||
|
||||
return keyPairMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 得到公钥
|
||||
*
|
||||
* @param publicKey 密钥字符串(经过base64编码)
|
||||
* @throws Exception
|
||||
*/
|
||||
public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
|
||||
//通过X509编码的Key指令获得公钥对象
|
||||
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
|
||||
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
|
||||
RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* 得到私钥
|
||||
*
|
||||
* @param privateKey 密钥字符串(经过base64编码)
|
||||
* @throws Exception
|
||||
*/
|
||||
public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
|
||||
//通过PKCS#8编码的Key指令获得私钥对象
|
||||
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
|
||||
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
|
||||
RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* 公钥加密
|
||||
*
|
||||
* @param data
|
||||
* @param publicKey
|
||||
* @return
|
||||
*/
|
||||
public static String publicEncrypt(String data, RSAPublicKey publicKey) {
|
||||
try {
|
||||
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
|
||||
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
|
||||
return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength()));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 私钥解密
|
||||
*
|
||||
* @param data
|
||||
* @param privateKey
|
||||
* @return
|
||||
*/
|
||||
|
||||
public static String privateDecrypt(String data, RSAPrivateKey privateKey) {
|
||||
try {
|
||||
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
|
||||
cipher.init(Cipher.DECRYPT_MODE, privateKey);
|
||||
return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), CHARSET);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 私钥加密
|
||||
*
|
||||
* @param data
|
||||
* @param privateKey
|
||||
* @return
|
||||
*/
|
||||
|
||||
public static String privateEncrypt(String data, RSAPrivateKey privateKey) {
|
||||
try {
|
||||
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
|
||||
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
|
||||
return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), privateKey.getModulus().bitLength()));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 公钥解密
|
||||
*
|
||||
* @param data
|
||||
* @param publicKey
|
||||
* @return
|
||||
*/
|
||||
|
||||
public static String publicDecrypt(String data, RSAPublicKey publicKey) {
|
||||
try {
|
||||
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
|
||||
cipher.init(Cipher.DECRYPT_MODE, publicKey);
|
||||
return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), publicKey.getModulus().bitLength()), CHARSET);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) {
|
||||
int maxBlock = 0;
|
||||
if (opmode == Cipher.DECRYPT_MODE) {
|
||||
maxBlock = keySize / 8;
|
||||
} else {
|
||||
maxBlock = keySize / 8 - 11;
|
||||
}
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
int offSet = 0;
|
||||
byte[] buff;
|
||||
int i = 0;
|
||||
try {
|
||||
while (datas.length > offSet) {
|
||||
if (datas.length - offSet > maxBlock) {
|
||||
buff = cipher.doFinal(datas, offSet, maxBlock);
|
||||
} else {
|
||||
buff = cipher.doFinal(datas, offSet, datas.length - offSet);
|
||||
}
|
||||
out.write(buff, 0, buff.length);
|
||||
i++;
|
||||
offSet = i * maxBlock;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("加解密阀值为[" + maxBlock + "]的数据时发生异常", e);
|
||||
}
|
||||
byte[] resultDatas = out.toByteArray();
|
||||
IOUtils.closeQuietly(out);
|
||||
return resultDatas;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user