公共传递参数json
参数名后端 |
类型服务器 |
必选app |
描述函数 |
app_id | string | 是 | 调用方身份ID,接口提供方用此来识别调不一样的调用者,该参数是API基本规范的一部分,请详见API公共规范。 |
sign_type | string | 是 | 签名类型:MD5,RSA2 |
sign编码 |
string排序 |
是 token |
一次接口调用的签名值,服务器端 “防止 假装请求/防篡改/ 防重发” 识别的重要依据。接口 |
timestamp字符串 |
Int |
是 |
时间戳(long Timestamp = DateTime.Now.Ticks;)
|
method | string | 是 | /user/info.json |
1.筛选并排序
获取全部请求参数,不包括字节类型参数,如文件、字节流,剔除sign字段,剔除值为空的参数,并按照第一个字符的键值ASCII码递增排序(字母升序排序),若是遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。
2.拼接
将排序后的参数与其对应值,组合成“参数=参数值”的格式,而且把这些参数用&字符链接起来,此时生成的字符串为待签名字符串。
3.调用签名函数
使用各自语言对应的SHA256WithRSA(对应sign_type为RSA2)或SHA1WithRSA(对应sign_type为RSA)签名函数利用商户私钥对待签名字符串进行签名,并进行Base64编码。
4.把生成的签名赋值给sign参数,拼接到请求参数中。
后端代码能够增长一个时间戳的时效性判断,好比时间戳必须是当前时间的先后半小时内(可与token的过期机制一致,若是涉及到资金,可能还要缩短期限制,而且在业务上还要作调整,好比转帐,先生成一个转帐订单,而后再发起一个转帐请求,判断是否已转帐,这样能够防止重复提交攻击,若是是app,还能够增长登陆会话中提交有效),这样能够防止重复提交攻击。
每次请求目标接口前,先使用签名的方法,获取一个验证码(基于会话,这个验证码在服务端的会话中,是一个指定的变量,同一会话,都是从这个变量中取),而后把这个验证码加入到目标接口参数中;由于验证码用事后就会换一个,目标接口请求完后,验证码失效,请求失败,可防止重复提交攻击。