为了保证数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接收签名数据之后进行签名校验。
数字签名有两个步骤,先按一定规则拼接要签名的原始串,再选择具体的算法和私钥计算出签名结果。
整体流程:请求时使用商户私钥加签,根据规则生成sign上送到易生,易生会使用商户公钥对商户报文进行验签,然后返回报文中包含易生私钥加签的sign字段,商户收到后使用易生提供的统一公钥进行验签,以保证传输过程中报文的安全性。
无论是请求还是应答,签名原始串按以下方式组装成字符串:
使用的签名算法为SM2,使用商户私钥加签, 加签串使用默认Asn编码不压缩。
将请求报文中data字段值按照名称的ASCII码从小到大进行排序以&连接,如果名称的首字母相同,则比较第二个字母,以此类推拼接成key=value&key=value的字符串,然后进行签名,保留原始串不用urlencode,并且赋值给sign。
返回报文先验签再反序列化为对象,者将请求报文中data字段值按照名称的ASCII码从小到大进行排序以&连接,如果名称的首字母相同,则比较第二个字母,以此类推拼接成key=value&key=value的字符串(同加签),使用易生提供的公钥验签来保证数据的有效性。
orgTrace 说明商户流水号,规则yyyyMMddHHmmss+自定义流水订单信息,如:20220418210000qqqqqqqq
/**
public static void main(String[] args) {
String privateKey = "BA76B0454AEE342F59AABE820F07359E5DE08D9FD394A8EFAF51D07EECEAE21F";
String publicKey = "02485EC4E3AF05580869F1862AB2F2BCDFAB08819616890D597E0D455F56A0CC61";
try {
System.out.println("公钥:" + publicKey);
System.out.println("私钥:" + privateKey);
JSONObject jsonObject = new JSONObject();
jsonObject.put("refNo" ,"000088886785");
jsonObject.put("termCode" ,"88888887");
jsonObject.put("tradeDate" ,"20120509");
String req = getReqStr(jsonObject);
System.out.println("待加签:" + req);
String sign = SMCryptUtils.sm2Sign(req, privateKey);
System.out.println("签名:" + sign);
boolean signRes = SMCryptUtils.sm2ServiceVerifySign(req, sign,publicKey);
System.out.println("验签结果:" + signRes);
} catch (CryptoException e) {
throw new RuntimeException(e);
}
}
商户编号(orgId)
555555555555555
密钥特别说明:
公钥使用编码过66位,参考SM2密钥生成规则【公钥使用压缩格式02/03开头】,可参考:
获取签名秘钥对 生成公私钥
java引入包:JAVA国密工具库
加签私钥 商户私钥(后续由商户生成对,公钥提供给易生merPriKey):
BA76B0454AEE342F59AABE820F07359E5DE08D9FD394A8EFAF51D07EECEAE21F
验签公钥 商户公钥(后续由商户生成对,公钥提供给易生merPubKey):
02485EC4E3AF05580869F1862AB2F2BCDFAB08819616890D597E0D455F56A0CC61
附测试加签后报文,加签模式【C1C3C2】
公钥:02485EC4E3AF05580869F1862AB2F2BCDFAB08819616890D597E0D455F56A0CC61
私钥:BA76B0454AEE342F59AABE820F07359E5DE08D9FD394A8EFAF51D07EECEAE21F
源数据:111111
sign r size: 33, hex: 00ee459b659028fa5e8f41c892da5e5df22ce8a31821cd4f2875d021b8d15c7f35
sign r size: 33, hex: 00b271913cc417b9f714b6a9131b4f0df2995a64699fd3b0dba021accb4ec2feb2
签名信息:3046022100EE459B659028FA5E8F41C892DA5E5DF22CE8A31821CD4F2875D021B8D15C7F35022100B271913CC417B9F714B6A9131B4F0DF2995A64699FD3B0DBA021ACCB4EC2FEB2
加密/解签 易生机构公钥(用于易生返回的报文验签):
02AEDBC219CCAC53AF0FDD2AD4583BD58F26AB04D9B88EFDAE041B9D11B4F47380 【测试环境公钥】
02C105E963641BFDB240DDDA7A729F29E79E56F5CF3E00F3F0AE51F6E33017995C 【生产环境公钥】
加密/解签 易生机构私钥(用于商户调试时验证):
FCB39DB317FACF3BB01324ADE5F9D4B439D5642A5FDBD2EA9718F697ADA30EB8