接口签名及防重放详细开发文档
公共参数
| 参数名称 | 是否必填 | 参数描述 |
|---|---|---|
| nonce | 是 | 唯一值,用来标识接口请求的唯一性,例如使用UUID值,示例:40A6A065-4DB7-4999-8F7F-F6D051D9B02C |
| timestamp | 是 | 时间戳,从1970年1月1日据当前时间的毫秒数 示例:1529373808 |
| vId | 是 | 版本号 |
| logicVID | 是 | 逻辑版本号 (应该是没用的) |
| vest | 是 | 马甲信息 ticai |
| uuid | 是 | 设备唯一标识 |
| agentId | 是 | 代销者编号 |
| channel | 是 | 渠道号 |
| interfaceVersion | 是 | 接口版本 |
| ckStr | 是 | 登录token |
| deviceVersion | 是 | 系统版本 |
| appVersion | 是 | 版本序列号 |
| user-agent-key | 是 | 客户端标识 |
| lskey | 是 | 登录token |
| uid | 是 | 资金账户编号 |
| accountNo | 是 | 资金账户编号 |
| iswx | 是 | 是否是微信登录(应该是没用的) |
| province | 是 | 省编号 |
| appType | 是 | app类型 (应该是没用的) |
| sdkVer | 是 | sdk版本号 |
| deviceVer | 是 | 设备型号 |
| manufacturer | 是 | 厂商 |
| brand | 是 | 型号 |
| token | 是 | 信鸽token |
| cmsWhere | 是 | 渠道号 |
| platform | 是 | 平台 |
| screenRes | 是 | 屏幕尺寸信息 |
签名规则
签名内容由header和body两部分组成
+(接口请求中将Cookie参数全部去掉)+
header中的数据处理
将header中的所有key(对应公共参数中的所有key)按照字母顺序排序,然后将所有的key和value拼接成为 key1value1key2value2 的格式,示例代码如下:
header中的原始数据
{
"accountNo": "112003abdc",
"agentId": "112003abdc",
"appType": "112003abdc",
"appVersion": "112003abdc",
"brand": "112003abdc",
"browserBrand": "112003abdc",
"channel": "112003abdc",
"ckStr": "112003abdc",
"cmsWhere": "112003abdc",
"cms_where": "112003abdc",
"deviceVer": "112003abdc",
"deviceVersion": "112003abdc",
"interfaceVersion": "112003abdc",
"iswx": "112003abdc",
"logicVID": "112003abdc",
"lskey": "112003abdc",
"manufacturer": "112003abdc",
"nonce": "112003abdc",
"platform": "112003abdc",
"province": "112003abdc",
"screenRes": "112003abdc",
"sdkVer": "112003abdc",
"timestamp": "112003abdc",
"token": "112003abdc",
"uid": "112003abdc",
"user-agent-key": "112003abdc",
"uuid": "112003abdc",
"vId": "112003abdc",
"vest": "112003abdc"
}
排序后得到的字符串
appTypezc_iosappVersion1610000brandiPhonechannelios_appstoreckStrcmsWhere800000deviceVerMacBookPro11,4lskeymanufacturerappleplatform2province11screenRes320.0-548.0sdkVer11.4token1user-agent-key4ed92dce-9c09-5554-8b3c-d4dfe43109a5uuid2F46685B-FD40-4A47-B621-E61A58B98650vId1610000vestticai
所有参数签名
参数分为了get参数和post参数,需要分别对get参数和post参数做处理
get参数处理
将所有的get参数如同上面header的处理,生成排序后的字符串,示例代码如下
get参数排序后的明文
cappConfigcmsWhere800000dappdataVer1610000_9177489552_1529596800deviceVerMacBookPro11,4mgetIndexConfigprovinceuseCookie1vId1610000vestticai
post参数处理
将所有的post参数如同上面的header处理,生成排序后的字符串,示例代码如下
post所有参数
{
"api_version" = 2;
appkey = 610163;
"channel_id" = 10001;
deviceid = "ABB50644-59BC-41AC-ABD4-DF3639891AF8";
imei = "";
imsi = "";
nonce = "40A6A065-4DB7-4999-8F7F-F6D051D9B02C";
"product_code" = 1006;
timestamp = 1529373808;
ua = "Apple Computer, Inc.^x86_64^iOS^11.4^(null)";
"version_code" = 1;
}
post参数排序后的明文
api_version2appkey610163channel_id10001deviceidABB50644-59BC-41AC-ABD4-DF3639891AF8imeiimsimethodih.boss.info.getPayChannelsnonce40A6
将已有被签名字符串进行拼接
签名明文 = header明文 + get明文 + post明文 + decode + 秘钥(这个顺序一定要注意)
示例代码如下
签名明文
秘钥:89bd32f2443f323f0cce581d9491e5c9e8
签名明文: appTypezc_iosappVersion1610000brandiPhonechannelios_appstoreckStrcmsWhere800000deviceVerMacBookPro11,4lskeymanufacturerappleplatform2province11screenRes320.0-548.0sdkVer11.4token1user-agent-key4ed92dce-9c09-5554-8b3c-d4dfe43109a5uuid2F46685B-FD40-4A47-B621-E61A58B98650vId1610000vestticaicappConfigcmsWhere800000dappdataVer1610000_9177489552_1529596800deviceVerMacBookPro11,4mgetIndexConfigprovinceuseCookie1vId1610000vestticaiapi_version2appkey610163channel_id10001deviceidABB50644-59BC-41AC-ABD4-DF3639891AF8imeiimsimethodih.boss.info.getPayChannelsnonce40A6124bd34f203f23f0cce581d9491e5c9e8
对签名明文做MD5并将MD5值转换为小写得到签名后的密文
签名密文
sign="21f1ceda0af19dc724b631e12ccee88d";
将签名值加入到header中
{
sign="21f1ceda0af19dc724b631e12ccee88d"
}
服务器校验
服务器接收到客户端请求后,做如上同样的操作,生成签名,并且与客户端的签名进行比对,比对失败则直接返回错误
异常提示
请求无效
防重放
nonce值
客户端生成唯一字符串作为nonce值(可以使用UUID,保证唯一就好),示例代码如下:
nonce="40A6A065-4DB7-4999-8F7F-F6D051D9B02C"
将nonce作为参数加入到header中
{
nonce:"40A6A065-4DB7-4999-8F7F-F6D051D9B02C"
}
服务器端接收到数据
服务器端接收到数据后,要对nonce进行校验,校验该nonce值是否存在,如果存在则直接拒绝此次请求,如果不存在将该nonce值存到缓存中
timestamp(时间戳)
生成时间戳
客户端生成当前时间戳
生成规则:
取当前时间去1970年1月1日0点的时间差,单位是毫秒
timestamp=1529373808
将生成的时间戳加入到header中
{
timestamp:1529373808
}
- 服务器端接收到数据
服务器端接收到数据后,拿获取到的时间戳和服务器的时间进行差值,如果超过30秒则认为请求无效,服务器直接拒绝
本文档详细介绍了接口签名的实现方式,包括公共参数说明、签名规则、签名明文生成流程、签名密文生成方法及服务器端校验机制。同时,针对防重放攻击,提供了nonce值和timestamp的使用策略。
139

被折叠的 条评论
为什么被折叠?



