栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

RSA签名工具类(该工具类结合【外部接口使用第二章(调用第三方接口工具类)】)--- 外部接口使用第一章

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RSA签名工具类(该工具类结合【外部接口使用第二章(调用第三方接口工具类)】)--- 外部接口使用第一章

package com.sport.sportactivityserver.common.utils.schoolfitness;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.binary.base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tk.mybatis.mapper.util.StringUtil;


public class RSAUtil {
private static final Logger logger = LoggerFactory.getLogger(RSAUtil.class);
private static final int DEFAULT_BUFFER_SIZE = 8192;
private static final String SIGN_CHARSET = “UTF-8”;
private static final String SIGN_TYPE_RSA = “RSA”;
private static final String SIGN_SHA256RSA_ALGORITHMS = “SHA256WithRSA”;
/市局参数/
// 测试环境 - 公钥
private static final String PUBLIC_KEY = “”;
// 正式环境 - 公钥,私钥
//private static final String PUBLIC_KEY = “”;
// private static final String PRIVATE_KEY = “”;

/本地参数/
//正式和测试都是这个
private static final String PRIVATE_KEY = “”;
// private static final String PUBLIC_KEY = “”;


public static String rsaSign(Map map) throws Exception {
// 将请求的参数封装处理下变成&符号连接的字符串
String content = getSignContent(map);

// 实例化私钥对象,然后根据参数字符串和私钥生成签名
PrivateKey priKey = getPrivateKeyFromPKCS8(new ByteArrayInputStream(PRIVATE_KEY.getBytes()));
Signature signature = Signature.getInstance(SIGN_SHA256RSA_ALGORITHMS);
signature.initSign(priKey);
signature.update(content.getBytes(SIGN_CHARSET));
return new String(base64.encodebase64(signature.sign()));
}


public static boolean rsaCheck(Map map) throws Exception {
// 将请求的参数封装处理下变成&符号连接的字符串
String content = getSignContent(map);

// 实例化公钥对象
PublicKey pubKey = getPublicKeyFromX509(new ByteArrayInputStream(PUBLIC_KEY.getBytes()));
Signature signature = Signature.getInstance(SIGN_SHA256RSA_ALGORITHMS);
signature.initVerify(pubKey);
signature.update(content.getBytes(SIGN_CHARSET));

// 处理并返回验签结果
String sign = map.get(“sign”);
return signature.verify(base64.decodebase64(sign.getBytes()));
}


private static String getSignContent(Map sortedParams) {
//appId,method,bizContent,生成签名所需的参数
String[] sign_param = sortedParams.get(“sign_param”).split(",");
List keys = new ArrayList<>();
Collections.addAll(keys, sign_param);
Collections.sort(keys);
StringBuilder content = new StringBuilder();
int index = 0;
for (String key : keys) {
String value = sortedParams.get(key);
if (StringUtil.isNotEmpty(key) && StringUtil.isNotEmpty(value)) {
content.append(index == 0 ? “” : “&”).append(key).append("=").append(value);
index++;
}
}
return content.toString();
}

private static PrivateKey getPrivateKeyFromPKCS8(InputStream ins) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(SIGN_TYPE_RSA);
byte[] encodedKey = readText(ins).getBytes();
encodedKey = base64.decodebase64(encodedKey);
return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey));
}

private static PublicKey getPublicKeyFromX509(InputStream ins) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(SIGN_TYPE_RSA);
StringWriter writer = new StringWriter();
io(new InputStreamReader(ins), writer, -1);
byte[] encodedKey = writer.toString().getBytes();
encodedKey = base64.decodebase64(encodedKey);
return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
}

private static String readText(InputStream ins) throws IOException {
Reader reader = new InputStreamReader(ins);
StringWriter writer = new StringWriter();
io(reader, writer, -1);
return writer.toString();
}

private static void io(Reader in, Writer out, int bufferSize) throws IOException {
if (bufferSize == -1) {
bufferSize = DEFAULT_BUFFER_SIZE >> 1;
}
char[] buffer = new char[bufferSize];
int amount;
while ((amount = in.read(buffer)) >= 0) {
out.write(buffer, 0, amount);
}
}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/318823.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号