APIv3接口使用国家商用密码指引

更新时间:2023.04.28

微信支付官方Java SDK (opens new window) 实现了国密的签名和验签等功能,推荐商户使用。如果商户需自行实现国密的签名和验签等功能,请按照以下接口规则实现。

# 1. 生成国密签名

# 1.1.请求签名

国密请求签名的规则,同国际算法基本一致,仅更改了具体算法。国际算法可参考签名生成

# 1.2. 构造待签名的消息

规则不变,仍然是:

1HTTP请求方法\n
2URL\n
3请求时间戳\n
4请求随机串\n
5请求报文主体\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解密