1
0
mirror of https://gitee.com/incloudcode/yexuejc-springboot.git synced 2026-03-10 06:50:05 +08:00
This commit is contained in:
2018-05-15 15:37:32 +08:00
parent 96c34332bc
commit a1dd4b12ab
13 changed files with 171 additions and 217 deletions

View File

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

View File

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

View File

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

View File

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