使用RSA生成密钥对(公钥和私钥)

工具类:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值