提供给第三方的API的签名验证问题
目前的状况
公司目前有若干的第三方API, 这些API是供第三方的一些渠道对接,让渠道可以访问到一些公司的业务信息,他们是这么设计的。
- 使用Bear Token 作为第三方访问API的时候的唯一验证方式, 当第三方需要访问公司的API的时候,任何请求需要在请求头里面添加 Authorization:头信息, 用来提供Token给服务器 从而验证当前的请求是否有效。
- 有一些操作我们想要回避第三方渠道, 如客户需要提交一些信息给服务器 第三方渠道不需要知道这些信息的时候, 我们会让访问第三方渠道的客户跳转到一个单独页面, 当然这个页面也需要有单独的token, 获取这个token的时候需要第三方渠道用带有 Authorization token的请求 去访问对应的生成token的API, 从而可以授权客户访问单独的页面和我方做交互
- 这些token 作为第三方渠道是完全可以看得到的,也就是说第三方渠道是可以冒充任何客户来和我们公司做交互。 但是君子协议说他们不会这么做。 这样出现的任何客户单独和我们做交互的页面的信息的丢失 第三方渠道是不需要负责任的。
- token并没有任何验证机制, 生成token 只是生成随机的固定长度的二进制数据, 然后转换为16进制, 然后做了一个有效时间验证保证token在6个小时内有效。没有任何的签名, 防重放攻击验证。
应该如何做签名验证
网上大概查了查 结合之前对接亚马逊 MWS接口的时候的经验,列一下一般的签名验证方法。
- 任何和API做对接的第三方都需要进行注册步骤, 通过注册后API会给第三方生成一个clientID 和一个SecketKey。 clientID是公开的, 用来唯一表示一个第三方渠道, 而secretKey是保密的只有第三方渠道和API知道, 用来加密计算散列值。
- API需要制定唯一的签名计算规则, 例如MWS使用Hmac, 使用key加密所有参数以一定固有规则排列好的 参数的散列值(包括clientID,以及时间戳, clientID可以确认是谁发的请求, 时间戳可以使得请求只在一段时间内有效, 在服务器端 可以直接判断 是否过了有效期, 被签名了的时间戳无法篡改), 带着该散列值访问服务。API来做校验,双方如果计算结果一致,则表明当前请求是持有secretKey的一方发出的。 否则就是非法的
- 但是如果作为中间人抓取到了请求的包, 那么中间人一直使用相同的参数(带有散列值和参数)一直发送请求虽然不能改变请求参数但是任然可以合法访问。那么这个时候就需要服务器做防重放攻击
- 我们可以在redis中存放一个集合, 每次有合法的请求过来的时候 我们就把这个计算出来的 散列值放入到集合中, 在请求到来的时候先看散列值是否在set中, 如果在就返回异常。
- 但是很明显每个请求的散列值都存入到redis中很不现实, 这时我们可以给散列值设置有效期,例如设置散列值的有效期为10分钟,只记录在10分钟内的请求的nounce是否存在。
提供给第三方的API的签名验证问题相关推荐
- Java 提供给第三方使用接口方法
Java提供接口给第三方使用,校验保证接口的安全性 前言 接口Controller 接口幂等性校验 实现类ServiceImpl 第三方调用接口Api实现类 生成签名工具类 HttpCilent工具类 ...
- 验证微软和微软提供给第三方的数字签名
验证微软和微软提供给第三方的签名 ,看MSDN内容好多啊!不过下面的程序对已签名的文件验证是没有问题的. // WinTrustSignature.cpp : Defines the entry po ...
- 30行代码消费腾讯人工智能开放平台提供的自然语言处理API
腾讯人工智能AI开放平台上提供了很多免费的人工智能API,开发人员只需要一个QQ号就可以登录进去使用. 腾讯人工智能AI开放平台的地址:https://ai.qq.com/ 里面的好东西很多,以自然语 ...
- 利用ffmpeg提供的库(API)进行音频与视频的编码并生成文件
Output example.c 目录 [隐藏] 1 概述 2 音频输出 2.1 add_audio_stream 2.2 open_audio 2.3 get_audio_frame 2.4 wri ...
- PHP如何自动识别第三方Restful API的内容,自动渲染成 json、xml、html、serialize、csv、php等数据...
如题,PHP如何自动识别第三方Restful API的内容,自动渲染成 json.xml.html.serialize.csv.php等数据? 其实这也不难,因为Rest API也是基于http协议的 ...
- 原生js提供的视频画中画api
经常看视频的朋友可能会遇到视频"画中画"的效果,例如你在看优酷的电视剧,向下滚动看推荐视频或者评论等信息的时候,发现上面的播放视频被屏幕上滚之后遮盖了,右下方出现了一个小视频播放器 ...
- java调用第三方天气预报API接口
java调用第三方天气预报API接口 package com.sensordata.controller; import com.common.json.JSONObject; import java ...
- 10-11月数据接口-京东商品信息api,金碟Api对接,京东商智监控商品request采集后指数还原,聚水潭第三方接入api,拼多多上架辅助非第三方SKU核对上传,拼多多销量无限修改更新
茶壶煮饺子: 1.京东商品信息api: http://app.miiow.com.cn:8181/ajaxApi.ashx/@/dontlogin/sycm/getJDItemBaseInfo?ite ...
- 痞子衡嵌入式:其实i.MXRT1050,1020,1015系列ROM也提供了FlexSPI driver API
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1050/1020/1015系列ROM中的FlexSPI驱动API使用. 今天痞子衡去4S店给爱车做保养了,保养一次要等两小 ...
最新文章
- android webview单向认证,android 让webview支持自签名证书https 双向认证(SSL)
- iOS 中strong,weak,copy,assign区别
- Java 线程池中的线程复用是如何实现的?
- LiveVideoStack成立5周年生日快乐!一路走来,感谢有你!
- python大气校正_Sentinel-2卫星影像的大气校正方法
- [原+转]CSS hack 小技巧 让你的CSS 兼容ff ie6.0 ie7.0
- xadmin在Django 1.11中的使用及中英文切换
- 12123两小时没付款怎么办_交管12123支付宝小程序付款不了怎么办 交管12123支付宝缴费方法介绍[多图]...
- Java面试那些事--可能会问的那些问题(中高级篇)
- 10年建模师给想学次世代游戏建模同学的一些忠告,太受益了!
- linux清除所有后台程序,Linux查看和关闭后台运行程序的方法
- deepin系统引导_Deepin系统安装教程
- STM32---IAPISP介绍
- Chrome安装HttpWatch
- 【Linux】CMAQ实践部署
- Vue 组件封装之 Result 结果页
- dockerfile使用DEBIAN_FRONTEND
- bc伐木机器人_1+X | 工业机器人操作编程平台(HB-CZBC-C10)
- MySql函数 - DATE_ADD()函数
- notifyDataSetInvalidated()和notifyDataSetChanged()有什么区别?