工具类:
import cn.hutool.core.codec.Base64Encoder;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Base64.Encoder;
/**
* RSA工具类
*/
public class RSAUtils {
/**
* 加签
* @param content
* @param privateKey
* @return
*/
public static String sign(String content, String privateKey) {
try {
PKCS8EncodedKeySpec pkcs8 = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey.getBytes(StandardCharsets.UTF_8)));
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey pk = kf.generatePrivate(pkcs8);
Signature sha1WithRSA = Signature.getInstance("SHA1WithRSA");
sha1WithRSA.initSign(pk);
sha1WithRSA.update(content.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(sha1WithRSA.sign());
} catch (Exception var6) {
var6.printStackTrace();
return null;
}
}
/**
* 验签
* @param content
* @param sign
* @param publicKey
* @return
*/
public static boolean verify(String content, String sign, String publicKey) {
try {
X509EncodedKeySpec x509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey.getBytes(StandardCharsets.UTF_8)));
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pk = kf.generatePublic(x509);
Signature sha1WithRSA = Signature.getInstance("SHA1WithRSA");
sha1WithRSA.initVerify(pk);
sha1WithRSA.update(content.getBytes(StandardCharsets.UTF_8));
return sha1WithRSA.verify(Base64.getDecoder().decode(sign.getBytes(StandardCharsets.UTF_8)));
} catch (Exception var7) {
var7.printStackTrace();
return false;
}
}
/**
* 生成秘钥对
* @return
*/
public static String[] genKey() {
try {
// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
//生成密钥对
KeyPair keyPair = gen.generateKeyPair();
//获取公钥
PublicKey publicKey = keyPair.getPublic();
//获取私钥
PrivateKey privateKey = keyPair.getPrivate();
Encoder encoder = Base64.getEncoder();
return new String[]{encoder.encodeToString(publicKey.getEncoded()), encoder.encodeToString(privateKey.getEncoded())};
} catch (NoSuchAlgorithmException var5) {
var5.printStackTrace();
return new String[2];
}
}
public static void main(String[] args) {
String dataJson = "{\"status\":\"4\",\"stockBillId\":\"TY1735470055052\",\"goodsList\":[{\"masterNo\":\"TEST20241229987101\",\"subNo\":\"TEST20241229987001\",\"entryId\":null,\"inComeHoldCode\":\"KCQ24122911301\",\"updateName\":\"测试abc\",\"updateTime\":\"2024-12-29 16:49:23\"}]}";
String msg = Base64Encoder.encode(dataJson.getBytes(StandardCharsets.UTF_8));
System.out.println(msg);
String senderId = "EXPXX";
String privateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCpLnyS9bjI+UDwDjhs4dN+Fepo4r5GyPU6itw4rzpMlP4YhFqZy0XvWOVJYqai2a8Dour+J/Qe1rEPXs3Ns6dPCeBWr+uWbPFWOxnEsFRnK75LLQps314yDB23vySsPqao16igR0K6559cXuXBxGWAYfcn2NJpVoik212tg4pl7tR8WYr4LID1Cs9jlJ1shsqAwQUtXUlQkijNW9oA8I18kV5/G+A3iT4p8GQslNp3jNAqifrN6GWdLcxsaZRPnPbI4X/N4AL46dxS8yHE34yAcjys6OimZhypdSyFf6X3GJ/Q1Agg+R4GjivVEBc+2qC9dFWyJAw7JST+RroplB0tAgMBAAECggEAUPpgRFN7PC8aJw0Xcv5wpdRFnCiT3PvJbVkT6cntxMQ4D3Iij6Sdd9/797FRg3dgbwQnKLnk/nHS1EGTjpckSQ+4IqYXxKumpJirT9r6u1tTvVX0vIH560ijXNUP76YZTY3UN8uEJERDogoGPUYNM3MwwxDkPelehFI/t5LTxs/OkT0CDvomRD3OJGYP7u7yfuylRTI0HFooh97jx0CjSMOd/3K+l0VF2EKjmDZwZ154adEnVDuDDxH9jjNHrwpUc3jjLKPo/NX8+nEkrbSlmUgJ0cTKkaBAHJUbjSk7wwkTDZM9ptjWQl7LG2MWIXKW80XfclJCKtdmttQy0a65wQKBgQDq9cUvvTnj43SFsN15rG0/SqRlWeNhw+nc13C7bMXr3DqTkBnIWDKwI5TXqoYr5o52NBdx3ce0Hl8Boozn65yYIE7nBxjzU2bdSiIhhvRdMOZwLYkYZBgcBRUlVcSV2OU1/1I+h/KGmqocGfNys3smSE2WuKR3bcNMBboQcuwg3QKBgQC4VM88KWh/ACvK+T+i9GmKtNmMUInZMrBvIktKZtqLOKfCWQl4bJamVPWtX4+UInzOg7/I9yfS2CMIQUpQ/FVHuEFTNV2Vj6pEoqxdlnZJBsDs9ILcpuwU7GCMnYePXGNudv3lnyR3v0ly6LzvdRRg13N8RhdOHqTgeApFRROAkQKBgEc/aaD1T3WkRnQ30qEPwTz9BGbbYBEIWIUoKz4aWNYRvQ18F+VhoVU6JOtVAUSUsER1vVpA90rOHt8fDH1TO/QBcAusYkt+0eVuknT6OGV965K+rCDiUVFF1Uix/l+2GqNKHgVqMgfRJJ5K3EC+3iwYprZ6nRy+AwetgON2BdZdAoGAMnj+ebG47DWGyEAxfZRBJfrZKsOOy0tG5ldUmF3Lb52myd+JaVEKeyb+Ume9L8m1tPJ8XDHY1LHb/dGq4LwHOeko8fjF1EMPU1XbrpCZeOuBfiCBiJuoPx5uXXJxAP9CNqgcY3iNCsD1AqLZwROk7dNwytGCZiCb8t7LqSX97hECgYAiCy3FglOqzmiA5PkfY9iMLIU7afqC17rmluvRejTD1/29XMUMav1yzBsa+4Yf13MIzJFAO4bKHZ9pfNUYDxB8sD4MbpD73OwrQWfewxXzy5imh/1RFil2W3RrvCt66n/KKqJ1WDzz7cxsTtB+Y/wIRtb7WIVLGAIU+IzPiWNDvw==";
String sign = sign("senderId=" + senderId + "&msg=" + msg, privateKey);
System.out.println(sign);
}
}
加签:
ObjectMapper mapper = new ObjectMapper();
String dataJson;
try {
dataJson = mapper.writer().writeValueAsString("数据对象");
} catch (JsonProcessingException e) {
throw new RuntimeException("请求参数有误,请稍后重试");
}
try {
String msg = Base64Encoder.encode(dataJson.getBytes(StandardCharsets.UTF_8));
apiBaseReq.setMsg(msg);
//加签
apiBaseReq.setSign(RSAUtils.sign("senderId=" + "EXPXX" + "&msg=" + msg, privateKey));
String pushJson = mapper.writer().writeValueAsString(apiBaseReq);
//发起调用
log.info(String.format("%s reqBody:%s", modeName.getInfName(), pushJson));
String respBody = HttpUtil.send(url, pushJson, connectTimeout, socketTimeout);
//String respBody = "{\"code\":200,\"msg\":\"success\",\"data\":null}";
log.info(String.format("%s respBody:%s", modeName.getInfName(), respBody));
验签:
JdApiBaseReq data = JSONObject.parseObject(params, JdApiBaseReq.class);
//验签
String content = "senderId=" + "EXPXX" + "&msg=" + data.getMsg();
if (RSAUtils.verify(content, data.getSign(), publicKey)) {
byte[] decode = Base64.getDecoder().decode(data.getMsg().getBytes(StandardCharsets.UTF_8));
String decodeString = new String(decode, StandardCharsets.UTF_8);
//转换
DataMsg dataMsg = JSON.parseObject(decodeString, DataMsg.class);
//对接收数据dataMsg进行处理。。。
} else {
throw new RuntimeException("验签失败");
}
另一种方法,如下:
依赖:
<dependency>
<groupId>io.github.gvtcy</groupId>
<artifactId>gvt_sdk_apollo</artifactId>
<version>1.4-RELEASE</version>
</dependency>
测试类:
import com.alibaba.fastjson.JSONObject;
import com.gvt.apollo.ApolloSdk;
import com.gvt.apollo.bean.BizBean;
import com.gvt.apollo.utils.SecurityUtils;
import lombok.Data;
import lombok.ToString;
import org.junit.Test;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
public class ApolloSdkTest {
@Data
@ToString
public class Shop implements BizBean {
private String appid;
private String shopName;
private String shopLocation;
private Member member=new Member();
private String sign;
@Override
public void setSign(String sign) {
this.sign=sign;
}
}
@Data
@ToString
public class Member{
private String memberId;
private String memberName;
}
/**
* 个人私钥
*/
private String personPriKey="......Ufyd5ZE/A0XlZVWroJENW2XDL0UUGvW+G+UVeAjJo7KMdRigieKLIhzpwUh8aDmcUag==";
/**
* 公钥
*/
private String personPubKey=".....TAPyCSfYuZ6yb8VNyvaw5jceke4SF2Q2wY9457Ar7RipEcpwWlZk3VPIwIDAQAB";
@Test
public void wrapSign() throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, SignatureException, InvalidKeyException {
ApolloSdk apolloSdk=new ApolloSdk();
Shop shop=new Shop();
shop.setAppid("r88");
shop.setShopName("门店");
shop.setShopLocation("街道");
Member member=new Member();
member.setMemberId("11");
member.setMemberName("张三");
shop.setMember(member);
System.out.println(JSONObject.toJSONString(shop));
Shop realShop = apolloSdk.wrapSign(SecurityUtils.getPriKey(personPriKey), shop);
System.out.println(realShop.getSign().length());
}
@Test
public void wrapJsonSign() throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, SignatureException, InvalidKeyException {
ApolloSdk apolloSdk=new ApolloSdk();
String json="{\"appid\":\"r788\",\"member\":{\"memberId\":\"11\",\"memberName\":\"张三\"},\"shopLocation\":\"街道\",\"shopName\":\"门店\"}";
System.out.println(apolloSdk.wrapSign(SecurityUtils.getPriKey(personPriKey), json));
}
@Test
public void validateSign() throws InvalidKeySpecException, NoSuchAlgorithmException, SignatureException, InvalidKeyException {
ApolloSdk apolloSdk=new ApolloSdk();
String json="{\"shopLocation\":\"深圳\",\"appid\":\"rr333sss7788\",\"member\":{\"memberName\":\"张三\",\"memberId\":\"11\"},\"sign\":\"QEQLxPTNGLVgoQL/WD5qvsZPLNUisDR1vqJ/MsJ02eXhhSg9PAztk2Ju7yUrBmnhoWCDt6V3jy2KwifwqfjP5glBf76/5A4tR3CYzRp1Q4M2u0AfSiuI5mWptwqNBRUsg/5IazCeOlKEQn2emYiluaxYM2WF7BbIv1zmvjM5Zw4=\",\"shopName\":\"门店\"}";
System.out.println(apolloSdk.validateSign(SecurityUtils.getPubKey(personPubKey), json));
}
}