APIv3接口使用国家商用密码指引
更新时间:2023.04.28微信支付官方Java SDK (opens new window) 实现了国密的签名和验签等功能,推荐商户使用。如果商户需自行实现国密的签名和验签等功能,请按照以下接口规则实现。
# 1. 生成国密签名
# 1.1.请求签名
国密请求签名的规则,同国际算法基本一致,仅更改了具体算法。国际算法可参考签名生成。
# 1.2. 构造待签名的消息
规则不变,仍然是:
1HTTP请求方法\n2URL\n3请求时间戳\n4请求随机串\n5请求报文主体\n
# 1.3. 计算数字签名
对待签名消息使用SM2椭圆曲线公钥密码算法的数字签名算法(SM2Sign with SM3),并对消息签名进行Base64编码,得到签名值。
签名格式:RS_ASN1。
签名使用的ID为“1234567812345678”,这是一个16字节的ASCII编码的可见字符串。这个值是标准规定的默认ID值。
# 1.4. 设置HTTP头
Authrization的认证类型使用 WECHATPAY2-SM2-WITH-SM3,替代WECHATPAY2-SHA256-RSA2048,其他保持不变。
# 1.5. HTTP头示例
1Authorization: WECHATPAY2-SM2-WITH-SM3 mchid="2480467911",nonce_str="fixednonce",timestamp="1636620536",serial_no="157056765AB5A9EEE5D363D0329039A254D5EF49",signature="MEYCIQC9Pab48+YSk12XBmbFOptRwDxbOy/deyz2haXso+UJhAIhAIXMAPRvH1qruowl21i8w/Ahy0/SpQvBrpcl9NGLomeV"
# 2. 如何验证国密签名
国密签名验证的规则,同国际算法基本一致,不同点如下:
- 验证算法使用SM2椭圆曲线公钥密码算法的签名验证算法。签名格式RS_ASN1。
- 新增HTTP头Wechatpay-Signature-Type表示认证类型
国际算法的说明可参考签名验证。
# 3. 敏感信息加密
使用SM2椭圆曲线公钥密码算法的公钥加密算法,替代RSA-OAEP。
密文格式:C1C3C2_ASN1。
# 4. 回调/证书加密
- 使用SM4分组密码算法的 SM4/GCM/NoPadding,替代 AES/GCM/NoPadding。
由于SM4密钥长度的限制,密钥由APIv3密钥通过国密SM3 hash计算生成。SM4密钥取摘要(256bit)的前128bit。
# 5. API各环节使用的算法说明
RSA算法 | 国密算法 | |
---|---|---|
下载平台证书以及回调通知加解密 | AES-256-GCM ( AES/GCM/NoPadding) | SM4 (SM4/GCM/NoPadding) |
计算签名值 | 使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值 | 使用商户私钥对待签名串进行SM2Sign with SM3签名,并对签名结果进行Base64编码得到签名值 签名格式:RS_ASN1 签名使用的ID为“1234567812345678” |
设置HTTP头 | 认证类型:WECHATPAY2-SHA256-RSA2048 | 认证类型:WECHATPAY2-SM2-WITH-SM3 |
应答认证类型 | 默认RSA (WECHATPAY2-SHA256-RSA2048) | 新增HTTP头Wechatpay-Signature-Type表示认证类型: 国密:WECHATPAY2-SM2-WITH-SM3 RSA:WECHATPAY2-SHA256-RSA2048 |
应答签名验证 | 使用微信支付平台公钥对验签名串和签名进行SHA256 with RSA签名验证 | 使用微信支付平台公钥对验签名串和签名进行SM2Sign with SM3签名验证 签名格式:RS_ASN1 |
敏感信息加密 | 加密算法:RSA公钥加密算法 填充方案:RSAES-OAEP | 加密算法:SM2公钥加密算法 密文格式:C1C3C2_ASN1 |
敏感信息解密 | 使用商户API证书私钥对下行的敏感信息的密文进行RSA解密 | 使用商户私钥对下行的敏感信息的密文进行SM2解密 |
文档是否有帮助