APIv3接口使用国家商用密码指引
更新时间:2024.07.25微信支付官方Java SDK 实现了国密的签名和验签等功能,推荐商户使用。如果商户需自行实现国密的签名和验签等功能,请按照以下接口规则实现。
1. 生成国密签名
1.1.请求签名
国密请求签名的规则,同国际算法基本一致,仅更改了具体算法。国际算法可参考签名生成。
1.2. 构造待签名的消息
规则不变,仍然是:
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头示例
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 | SM4 |
计算签名值 | 使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值 | 使用商户私钥对待签名串进行SM2Sign with SM3签名,并对签名结果进行Base64编码得到签名值 |
设置HTTP头 | 认证类型:WECHATPAY2-SHA256-RSA2048 | 认证类型:WECHATPAY2-SM2-WITH-SM3 |
应答认证类型 | 默认RSA | 新增HTTP头Wechatpay-Signature-Type表示认证类型: |
应答签名验证 | 使用微信支付平台公钥对验签名串和签名进行SHA256 with RSA签名验证 | 使用微信支付平台公钥对验签名串和签名进行SM2Sign with SM3签名验证 |
敏感信息加密 | 加密算法:RSA公钥加密算法 | 加密算法:SM2公钥加密算法 |
敏感信息解密 | 使用商户API证书私钥对下行的敏感信息的密文进行RSA解密 | 使用商户私钥对下行的敏感信息的密文进行SM2解密 |