Skip to content
On this page

签名&验签

用于防止数据篡改,保障交互的安全性 签名模式为公钥模式

签名

签名逻辑

  • 筛选并排序 获取所有公共请求参数,不包括字节类型参数,如文件、字节流,剔除 sign 字段,剔除值为空的参数,并按照第一个字符的键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推。
  • 拼接 将排序后的参数与其对应值,组合成 参数=参数值 的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待签名字符串。
  • 调用签名函数 使用各自语言对应的 SHA256WithRSA 签名函数利用应用私钥对签名字符串进行签名,并进行 Base64 编码。把生成的签名 encode 后赋值给 sign 参数,拼接到请求参数中。

示例

响应示例如下

JSON
{
    "code": "200",
    "msg": "success",
    "bizData": "{\"result\":true}",
    "nonce": "6fd167d8ba2d4a5db1d6190132e21f1f",
    "timestamp": 1664173479631
}  

实际签名字符串为:

  bizData={"result":true}&code=200&msg=success&nonce=6fd167d8ba2d4a5db1d6190132e21f1f&timestamp=1664173989933

拼接签名后的响应参数:

JSON
{
    "code": "200",
    "msg": "success",
    "bizData": "{\"result\":true}",
    "nonce": "6fd167d8ba2d4a5db1d6190132e21f1f",
    "timestamp": 1664173479631,
    "sign": "Hq/GPmw+cNUOqBSJ034d4xYQorpzzXy294nP4DqGthBrojj9ZsNQhYAcX8nFNs1XZx8KuwKqNt9uwDPvB2aQXAD66DN70blufZwqxKqgT1B9HMd5wGhBkqjL1NBHBeKNt8Wlqupvb7oXyPHYWj0N2gAEh/z/OpyOOTBNVF5GYGHjR2fUWaUVcNoCT2MrBAKwfx5WRm1hcDKZx7CMnwXSC0G+qQhoE/Lb4cnpJQLrSjcF/1nk4kTNqYC66IGDkSGyGi7++n0oCK92KJpURGgaQbZxvmLkeCuqTjkSNL/GmmhKsUgUobGowP8yNRq3l7eVhCy7epjPyO6xgo3GbkvdmA=="
}  

验签

验签逻辑

  • 筛选并排序 获取所有公共请求参数,不包括字节类型参数,如文件、字节流,剔除 sign 字段,剔除值为空的参数,并按照第一个字符的键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推。
  • 拼接 将排序后的参数与其对应值,组合成 参数=参数值 的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待验签字符串。
  • 调用验签函数 使用各自语言对应的 SHA256WithRSA 验签函数利用盯链公钥对验签字符串进行验签。

示例

接收到的请求参数如下

JSON
{
    "appId": "xxxxxxxxx",
    "method": "market.transfer.verify.phone",
    "bizData": "{\"phoneNumber\":\"18888888888\"}",
    "nonce": "6fd167d8ba2d4a5db1d6190132e21f1f",
    "sign": "XXXXXXXXXXX",
    "timestamp": 1664365350207
}  

实际验签字符串为:

  appId=xxxxxxxxx&bizData={"phoneNumber":"18888888888"}&method=market.transfer.verify.phone&nonce=6fd167d8ba2d4a5db1d6190132e21f1f&timestamp=1664365350207

签名工具下载