5.4.6.1 应用接入签名算法
链下业务系统向城市节点网关发送交易请求时,需使用应用接入密钥对中的私钥对交易请求报文进行数字签名,节点网关接收到交易请求报文后,使用已上传或托管的密钥对中的公钥对该报文进行验签。只有在交易报文验签通过时,网关才会对交易请求报文进行后续的交易处理。具体签名算法如下:
1. 组装签名字符串
将请求参数按照文档参数表格中的顺序转换为字符串进行拼接,其中请求参数优先拼接Header中的UserCode、AppCode;返回参数优先拼接code、msg,然后再次按照文档参数顺序拼接Body中的参数。
2. 不同类型的转换格式
类型 | 规则 | 示例 | 结果 |
---|---|---|---|
String | 不转换 | abc | abc |
Int/int64/long | 十进制转换 | -12 | -12 |
Float | 十进制转换,小数位参考备注 | 1.23 | 1.23 |
Bool | 转换为“true”或者“false” | true | true |
Array | 按照参数顺序和类型拼接 | [“abc”,”xyz”] | abcxyz |
Map[key]value | 按照顺序拼接key和value | {“a”:1,”b”:2} | a1b2 |
Object | 将对象内的属性按照文档循序依据上述格式转换 | {“name”:”abc”,”secret”:”123456”} | abc123456 |
3. 签名规则
a) 针对使用国密算法的CITA框架应用,使用以下规则哈希值计算:将按照上述规则转换后的待签名的字符串按照UTF-8编码做SM3计算;
对哈希值获取签名:哈希值与私钥进行SM2加密签名计算;
将签名结果做Base64计算。
4. 示例
参数: {"header":{"userCode":"user01","appCode":"app01"},
"mac":"",
"body":{“userId”:”abc”,”list”:[“abc”,”xyz”]}}
结果:user01app01abcabcxyz