Appearance
加密及签名规范
除网关支付业务外,其他业务使用的加密及签名规范。
原则
交易报文传输都需要进行加密解密、签名验签处理。
无论是请求端还是响应端接收到报文后,都需要进行签名验证,即按照约定算法重新生成签名,然后和收到的签名进行对比,对比通过后才能进行报文内容的解析,否则报文或文件内容可能出现篡改、部分丢失、伪造的问题。
报文加密算法:国际 DES/CBC/PKCS5Padding,国密 SM4/CBC/PKCS7Padding
会话密钥生成:KeyGenerator方法,参考demo;国际8个字节,国密16个字节
会话密钥加密算法:国际 RSA/ECB/PKCS1Padding,国密 模式C1C3C2
签名算法:国际 SHA1withRSA,国密 ASN1编码(R+S)
密钥对生成
- 对于商户来说,需要生成自己的RSA/SM2密钥对(包含公钥和私钥),其中私钥合作方自己保留,同时把公钥提供给平台,私钥注意保密。
- 对于平台来说,需要为每个商户生成对应的公私钥对,其中私钥平台自己保留,公钥需要提供给商户。
- 密钥生成工具,请查看 “商户测试准备事项/上线准备阶段 章节”
加密及签名
- 对请求报文JSON明文(UTF-8编码)使用发送方的私钥进行签名(RSA/SM2),并将签名结果转换为HEX字符串,得到 sign 域。
- 根据demo中的方法,生成随机密钥key,DES的密钥8字节,SM4的密钥16字节
- 使用密钥key对JSON明文进行加密(DES/SM4),并将加密结果转换为HEX字符串,得到 msg_enc 域。
- 使用接收方公钥对会话密钥SK加密(RSA/SM2),并将结果转换为HEX字符串,得到 key_enc 域。
RSA请求流程
SM2请求流程
解密及验签
- 对响应报文字符串分隔(分隔符:&),获得merchant_id=、msg_enc=、key_enc=、sign=域的16进制数据
- 将key_enc域转换为二进制byte数组,使用接收方放的私钥对会话密钥,得到明文key字节;
- 将msg_enc与转换为二进制byte数组,使用上一步得到的会话密钥key解密,得到明文data;
- 使用上一步解密得到的明文data、发送方公钥和sign域数据验证签名的有效性。