package com.agentdriving.user.modular.system.util.MallBook.util;
|
|
|
import com.agentdriving.user.modular.system.util.MallBook.config.ChannelConfig;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
|
import java.io.BufferedReader;
|
import java.io.FileReader;
|
import java.io.IOException;
|
import java.security.KeyFactory;
|
import java.security.PrivateKey;
|
import java.security.PublicKey;
|
import java.security.spec.PKCS8EncodedKeySpec;
|
import java.security.spec.X509EncodedKeySpec;
|
|
/**
|
* @author RSA签名验签类
|
*/
|
public class RSASignature {
|
|
public static Logger logger = LoggerFactory.getLogger(RSASignature.class);
|
|
/**
|
* 签名算法
|
*/
|
public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
|
|
|
/**
|
* 商户平台私钥签名
|
*
|
* @param content
|
* @return
|
*/
|
public static String sign(String content) {
|
try {
|
String privateKey = ChannelConfig.merchantPrivateKey;
|
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
|
KeyFactory keyf = KeyFactory.getInstance("RSA");
|
PrivateKey priKey = keyf.generatePrivate(priPKCS8);
|
java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
|
signature.initSign(priKey);
|
signature.update(content.getBytes());
|
byte[] signed = signature.sign();
|
return Base64.encode(signed);
|
} catch (Exception e) {
|
logger.error("签名失败{}", e);
|
}
|
return null;
|
}
|
|
|
/**
|
* 读取证书
|
*
|
* @param filePath 证书文件路径
|
*/
|
public static String loadKey(String filePath) throws Exception {
|
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
|
String readLine;
|
StringBuilder sb = new StringBuilder();
|
while ((readLine = br.readLine()) != null) {
|
sb.append(readLine);
|
}
|
return sb.toString();
|
} catch (IOException e) {
|
throw new Exception("私钥数据读取错误");
|
} catch (NullPointerException e) {
|
throw new Exception("私钥输入流为空");
|
}
|
}
|
|
|
/**
|
* mallbook公钥验签
|
*
|
* @param content 待签名数据
|
* @param sign 签名值
|
* @return false 验签失败 true 成功
|
*/
|
public static boolean validate(String content, String sign) {
|
boolean verify = false;
|
try {
|
String publicKey = ChannelConfig.mallBookPublicKey;
|
verify = RSASignature.doCheck(content, sign, publicKey, "utf-8");
|
} catch (Exception e) {
|
logger.error("验签失败:{}", e);
|
}
|
return verify;
|
}
|
|
|
/**
|
* RSA验签
|
*
|
* @param content 待签名数据
|
* @param sign 签名值
|
* @param publicKey 分配给开发商公钥
|
* @param encode 字符集编码
|
* @return 布尔值
|
*/
|
public static boolean doCheck(String content, String sign, String publicKey, String encode) {
|
try {
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
byte[] encodedKey = Base64.decode(publicKey);
|
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
|
java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
|
signature.initVerify(pubKey);
|
signature.update(content.getBytes(encode));
|
return signature.verify(Base64.decode(sign));
|
} catch (Exception e) {
|
logger.error("验签失败{}", e);
|
}
|
return false;
|
}
|
|
}
|