微信支付官方Java SDK (opens new window) 實現(xiàn)了國密的簽名和驗簽等功能,推薦商戶使用。如果商戶需自行實現(xiàn)國密的簽名和驗簽等功能,請按照以下接口規(guī)則實現(xiàn)。
# 1. 生成國密簽名
# 1.1.請求簽名
國密請求簽名的規(guī)則,同國際算法基本一致,僅更改了具體算法。國際算法可參考簽名生成。
# 1.2. 構造待簽名的消息
規(guī)則不變,仍然是:
1HTTP請求方法\n2URL\n3請求時間戳\n4請求隨機串\n5請求報文主體\n
# 1.3. 計算數(shù)字簽名
對待簽名消息使用SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法(SM2Sign with SM3),并對消息簽名進行Base64編碼,得到簽名值。
簽名格式:RS_ASN1。
簽名使用的ID為“1234567812345678”,這是一個16字節(jié)的ASCII編碼的可見字符串。這個值是標準規(guī)定的默認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. 如何驗證國密簽名
國密簽名驗證的規(guī)則,同國際算法基本一致,不同點如下:
- 驗證算法使用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各環(huán)節(jié)使用的算法說明
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解密 |