package com.nova.sankuai.domain.api.zhongan; import java.util.Date; import java.util.HashMap; import java.util.Map; import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang.time.DateFormatUtils; /** *

* description *

* * @author denglb 2021/11/15 */ public class StandardSignTest { private static final String API_NAME = "apiName"; private static final String CHANNEL_NO = "channelNo"; private static final String SUPPLIER_NO = "supplierNo"; private static final String REQ_DATE = "reqDate"; private static final String REQ_NO = "reqNo"; private static final String RESP_CODE = "respCode"; private static final String RESP_MSG = "respMsg"; private static final String RESP_NO = "respNo"; private static final String RESULT = "result"; private static final String THIRD_USER_NO = "thirdUserNo"; private static final String APPKEY = "appKey"; private static final String SERVICE_NAME = "serviceName"; private static final String BIZ_CONTENT = "bizContent"; private static final String TIMESTAMP = "timestamp"; private static final String FORMAT = "format"; private static final String SIGN_TYPE = "signType"; private static final String CHARSET = "charset"; private static final String VERSION = "version"; private static final String SIGN = "sign"; private static final String CERTI_NO = "certiNo"; private static final String PHONE = "phone"; private static final String IS_ALLOW_CREDIT = "isAllowCredit"; private static final String ERROR_CODE = "errorCode"; private static final String ERROR_MSG = "errorMsg"; private static final String VAL_APP_KEY = "Iy3HB0gFFdha2ifV"; private static final String VAL_CHANNEL_NO = "DL-ZAXD001"; private static final String VAL_CHARSET_DEFAULT = "UTF-8"; private static final String VAL_FORMAT_DEFAULT = "json"; private static final String VAL_SIGN_TYPE_DEFAULT = "RSA"; private static final String VAL_SERVICE_NAME = "duolai.preloan"; private static final String VAL_SUCCESS_CODE = "0000"; private static final String VAL_SUCCESS_MSG = ""; private static final String VAL_VERSION = "1.0.0"; //TODO 供应商私钥 private String supplierPrivateKey = ""; //TODO 供应商公钥 private String supplierPublicKey = ""; private String zaPrivateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAO8h8JCJAMb1nd0uBkzZuWyNnL+atBzJKvIG7escD45ODf0AWKr8vSqLZ01HD86+a496CGjsae6GybK8C1MqiMSwaAsIv31nKD6U8xF607MPrD3r2lyjwUnmqBZY++R6yFNYz9ZDXcdiwCudESRsXunPJq7zfnnglCtEH+qqW8/VAgMBAAECgYEAnVc2gtMyKLbZTPuId65WG7+9oDB5S+ttD1xR1P1cmuRuvcYpkS/Eg6a/rJASLZULDpdbyzWqqaAUPD8QMINvAr3ZtkbwH5R0F/4aqOlx/5B0Okjsp3eSK2bQ8J2m/MmFKZxr6Aily7YUDdxcGcjLizsGi1KDkWS22JRufEeUNA0CQQD+g1XJ7ELqmUtrS4m4XnadB25f0g5QC0tMjoa3d9soMzK3q+Drkv8EZVpGSmSHEo1VlE7HUcnKNvK1BO5Nm4iXAkEA8IeZxaWmEcsRqiuFz8xmYGtKcYTmHgheGF4D+fnnFozSNP+3sS1lfgFQrjUkqUyZOoG1hPc6SDhGS4nbXwiscwJASO+gPR58yrgledkK3ZAMk9GWWtVajqu953GMv7UUU//gD+yspzXX6Q2WgkA9cMvrPtQig1I37sAya5e/JvRkfwJARzzCDEmdP9PW7YFqZjrxb0kXiTuFNAviYnEl2FltWb5nW48JBo6dao5VKONQclvfXfagnjriphUUrLatpB3bhQJAKRfJS6jDAIVKt7So5HOdzk4ipxgrMjG/QtZ1grO+VQectk4+tCwdJhOrr5blvdPQvFVqXBQfXuE7cibZrGs4sQ=="; private String zaPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvIfCQiQDG9Z3dLgZM2blsjZy/mrQcySryBu3rHA+OTg39AFiq/L0qi2dNRw/OvmuPegho7GnuhsmyvAtTKojEsGgLCL99Zyg+lPMRetOzD6w969pco8FJ5qgWWPvkeshTWM/WQ13HYsArnREkbF7pzyau83554JQrRB/qqlvP1QIDAQAB"; /** * 众安侧发起请求 */ public void requestSignTest() { Map map = new HashMap<>(); map.put(API_NAME, "queryBankList"); map.put(CHANNEL_NO, VAL_CHANNEL_NO); map.put(REQ_DATE, new Date()); map.put(REQ_NO, "UUID1234567890"); map.put(THIRD_USER_NO, "DLJD_DL-ZAXD001_162307848013107"); System.out.println("加密前的数据:" + JSONObject.toJSONString(map)); //使用供应商的公钥加密 String bizContent = SignUtil.encryptByPublicKeyWithNoOrderForLongData(JSONObject.toJSONString(map), supplierPublicKey); Map req = new HashMap<>(); req.put(APPKEY, VAL_APP_KEY);// appKey req.put(SERVICE_NAME, VAL_SERVICE_NAME);// serviceName req.put(BIZ_CONTENT, bizContent);// 业务数据 req.put(TIMESTAMP, DateFormatUtils.format(new Date(), "yyyyMMddHHmmssSSS"));// 时间戳 req.put(FORMAT, VAL_FORMAT_DEFAULT);// 格式化类型 req.put(SIGN_TYPE, VAL_SIGN_TYPE_DEFAULT);// 签名类型 req.put(CHARSET, VAL_CHARSET_DEFAULT);// 字节编码 req.put(VERSION, VAL_VERSION);// API版本号 // 众安的私钥加签 String sign = SignUtil.doSign(req, zaPrivateKey); // sign签名当成请求入参 req.put(SIGN, sign); System.out.println("加密后的数据:" + JSONObject.toJSONString(req)); //----------------------分割线-------------------------- String getSign = String.valueOf(req.remove(SIGN)); // 使用众安的公钥验签 boolean verify = SignUtil.rsa256CheckContent(req, getSign, zaPublicKey); // Assert.assertTrue("验签失败......", verify); // 使用供应商的私钥解密 String decryptBizContent = SignUtil.decryptRSAByPrivateKeyForLongData(String.valueOf(req.get(BIZ_CONTENT)), supplierPrivateKey); System.out.println("解密后的数据:" + decryptBizContent); } /** * 供应商返回 */ public void responseSignTest() { Map result = new HashMap<>(); result.put(CERTI_NO, "MD5_CERIT_NO"); result.put(PHONE, "MD5_PHONE_NO"); result.put(IS_ALLOW_CREDIT, true); Map respInner = new HashMap<>(); respInner.put(RESULT, result); respInner.put(RESP_CODE, "0000"); respInner.put(RESP_MSG, "业务成功"); respInner.put(RESP_NO, "UUID1234567890"); respInner.put(REQ_NO, "UUID1234567890"); System.out.println("加密前的数据:" + JSONObject.toJSONString(respInner)); //使用众安的公钥加密 String bizContent = SignUtil.encryptByPublicKeyWithNoOrderForLongData(JSONObject.toJSONString(respInner), zaPublicKey); Map resp = new HashMap<>(); resp.put(BIZ_CONTENT, bizContent);// 业务数据 resp.put(CHARSET, VAL_CHARSET_DEFAULT);// 字节编码 resp.put(FORMAT, VAL_FORMAT_DEFAULT);// 格式化类型 resp.put(TIMESTAMP, DateFormatUtils.format(new Date(), "yyyyMMddHHmmssSSS"));// 时间戳 resp.put(SIGN_TYPE, VAL_SIGN_TYPE_DEFAULT);// 签名类型 resp.put(ERROR_CODE, VAL_SUCCESS_CODE);// 错误码 resp.put(ERROR_MSG, VAL_SUCCESS_MSG);// 错误信息 // 供应商的私钥加签 String sign = SignUtil.doSign(resp, supplierPrivateKey); // sign签名当成请求入参 resp.put(SIGN, sign); System.out.println("加密后的数据:" + JSONObject.toJSONString(resp)); //----------------------分割线-------------------------- String getSign = String.valueOf(resp.remove(SIGN)); // 使用供应商的公钥验签 boolean verify = SignUtil.rsa256CheckContent(resp, getSign, supplierPublicKey); // Assert.assertTrue("验签失败......", verify); // 使用众安私钥解密 String decryptBizContent = SignUtil.decryptRSAByPrivateKeyForLongData(String.valueOf(resp.get(BIZ_CONTENT)), zaPrivateKey); System.out.println("解密后的数据:" + decryptBizContent); } /** * 供应商发起请求 */ public void callSignTest() { Map map = new HashMap<>(); map.put(CHANNEL_NO, VAL_CHANNEL_NO); map.put(REQ_DATE, new Date()); map.put(REQ_NO, "UUID1234567890"); map.put(THIRD_USER_NO, "DLJD_DL-ZAXD001_162307848013107"); System.out.println("加密前的数据:" + JSONObject.toJSONString(map)); //使用众安的公钥加密 String bizContent = SignUtil.encryptByPublicKeyWithNoOrderForLongData(JSONObject.toJSONString(map), zaPublicKey); Map req = new HashMap<>(); req.put(APPKEY, VAL_APP_KEY);// appKey req.put(SERVICE_NAME, VAL_SERVICE_NAME);// serviceName req.put(BIZ_CONTENT, bizContent);// 业务数据 req.put(TIMESTAMP, DateFormatUtils.format(new Date(), "yyyyMMddHHmmssSSS"));// 时间戳 req.put(FORMAT, VAL_FORMAT_DEFAULT);// 格式化类型 req.put(SIGN_TYPE, VAL_SIGN_TYPE_DEFAULT);// 签名类型 req.put(CHARSET, VAL_CHARSET_DEFAULT);// 字节编码 req.put(VERSION, VAL_VERSION);// API版本号 req.put(SUPPLIER_NO, "供应商编码");//TODO 供应商发起请求该值必填,值为众安侧分配的编码 // 供应商的私钥加签 String sign = SignUtil.doSign(req, supplierPrivateKey); // sign签名当成请求入参 req.put(SIGN, sign); System.out.println("加密后的数据:" + JSONObject.toJSONString(req)); //----------------------分割线-------------------------- String getSign = String.valueOf(req.remove(SIGN)); // 使用供应商的公钥验签 boolean verify = SignUtil.rsa256CheckContent(req, getSign, supplierPublicKey); // Assert.assertTrue("验签失败......", verify); // 使用众安私钥解密 String decryptBizContent = SignUtil.decryptRSAByPrivateKeyForLongData(String.valueOf(req.get(BIZ_CONTENT)), zaPrivateKey); System.out.println("解密后的数据:" + decryptBizContent); } /** * 众安侧返回 */ public void callResponseSignTest() { Map map = new HashMap<>(); map.put(CERTI_NO, "MD5_CERIT_NO"); map.put(PHONE, "MD5_PHONE_NO"); map.put(IS_ALLOW_CREDIT, true); System.out.println("加密前的数据:" + JSONObject.toJSONString(map)); //使用供应商的公钥加密 String bizContent = SignUtil.encryptByPublicKeyWithNoOrderForLongData(JSONObject.toJSONString(map), supplierPublicKey); Map resp = new HashMap<>(); resp.put(BIZ_CONTENT, bizContent);// 业务数据 resp.put(CHARSET, VAL_CHARSET_DEFAULT);// 字节编码 resp.put(FORMAT, VAL_FORMAT_DEFAULT);// 格式化类型 resp.put(TIMESTAMP, DateFormatUtils.format(new Date(), "yyyyMMddHHmmssSSS"));// 时间戳 resp.put(SIGN_TYPE, VAL_SIGN_TYPE_DEFAULT);// 签名类型 resp.put(ERROR_CODE, VAL_SUCCESS_CODE);// 错误码 resp.put(ERROR_MSG, VAL_SUCCESS_MSG);// 错误信息 // 众安的私钥加签 String sign = SignUtil.doSign(resp, zaPrivateKey); // sign签名当成请求入参 resp.put(SIGN, sign); System.out.println("加密后的数据:" + JSONObject.toJSONString(resp)); //----------------------分割线-------------------------- String getSign = String.valueOf(resp.remove(SIGN)); // 使用众安的公钥验签 boolean verify = SignUtil.rsa256CheckContent(resp, getSign, zaPublicKey); // Assert.assertTrue("验签失败......", verify); // 使用供应商的私钥解密 String decryptBizContent = SignUtil.decryptRSAByPrivateKeyForLongData(String.valueOf(resp.get(BIZ_CONTENT)), supplierPrivateKey); System.out.println("解密后的数据:" + decryptBizContent); } }