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×tamp=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×tamp=1664365350207
签名工具下载
- 签名工具代码 DEMO 下载: