对外开放的接口验证方式_YHJ的博客-程序员秘密

技术标签: java  

接口安全问题

  • 请求身份是否合法?
  • 请求参数是否被篡改?
  • 请求是否唯一?

 

AccessKey&SecretKey (开放平台)

请求身份

为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)。

防止篡改

参数签名

  1. 按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA;
  2. 在stringA最后拼接上Secretkey得到字符串stringSignTemp;
  3. 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。

请求携带参数AccessKeySign,只有拥有合法的身份AccessKey和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到SecretKey(仅作本地加密使用,不参与网络传输),无法伪造合法的请求。

重放攻击

虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患。

 

timestamp+nonce方案

nonce指唯一的随机字符串,用来标识每个被签名的请求。通过为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用(记录所有用过的nonce以阻止它们被二次使用)。

然而,对服务器来说永久存储所有接收到的nonce的代价是非常大的。可以使用timestamp来优化nonce的存储

假设允许客户端和服务端最多能存在15分钟的时间差,同时追踪记录在服务端的nonce集合。当有新的请求进入时,首先检查携带的timestamp是否在15分钟内,如超出时间范围,则拒绝,然后查询携带的nonce,如存在已有集合,则拒绝。否则,记录该nonce,并删除集合内时间戳大于15分钟的nonce(可以使用redis的expire,新增nonce的同时设置它的超时失效时间为15分钟)。

 

实现

请求接口:http://api.test.com/test?name=hello&home=world&work=java

  • 客户端

    1. 生成当前时间戳timestamp=now和唯一随机字符串nonce=random
    2. 按照请求参数名的字母升序排列非空请求参数(包含AccessKey)
      stringA="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random";
    3. 拼接密钥SecretKey
      stringSignTemp="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random&SecretKey=secret";
    4. MD5并转换为大写
      sign=MD5(stringSignTemp).toUpperCase();
    5. 最终请求
      http://api.test.com/test?name=hello&home=world&work=java&timestamp=now&nonce=nonce&sign=sign;
  • 服务端
    服务端流程

Token&AppKey(APP)

在APP开放API接口的设计中,由于大多数接口涉及到用户的个人信息以及产品的敏感数据,所以要对这些接口进行身份验证,为了安全起见让用户暴露的明文密码次数越少越好,然而客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。

Token身份验证

  1. 用户登录向服务器提供认证信息(如账号和密码),服务器验证成功后返回Token给客户端;
  2. 客户端将Token保存在本地,后续发起请求时,携带此Token
  3. 服务器检查Token的有效性,有效则放行,无效(Token错误或过期)则拒绝。

安全隐患:Token被劫持,伪造请求和篡改参数。

Token+AppKey签名验证

与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证。这样,即使Token被劫持,对方不知道AppKey和签名算法,就无法伪造请求和篡改参数。再结合上述的重发攻击解决方案,即使请求参数被劫持也无法伪造二次重复请求。

 

实现

登陆和退出请求

登陆和退出流程

后续请求

  • 客户端
    和上述开放平台的客户端行为类似,把AccessKey改为token即可。

  • 服务端
    服务端流程

源码

请移步聚合支付平台,博主正在开发的一款开源项目,其中接口验证采用的就是上文中开放平台的验证方案,欢迎大家Star!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40918067/article/details/117048480

智能推荐

springboot: mybatis的使用_abcd198203的博客-程序员秘密

第一步:引入mybatis依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId>...

找工作再也不愁之面试题全覆盖-设计模式&数据结构_你说一下树形结构和线性结构的优势?_墨家巨子@俏如来的博客-程序员秘密

设计模式部分常见的设计模式说一下单例模式:一个类只能有一个实例,分为饿汉模式(迫切加载)和懒汉模式(延迟加载)和枚举。工厂模式:隐藏了产品的复杂创建过程,实现生产功能的复用,让产品生产更加高效。分为简单工厂(需要来回切换生产线),工厂方法(开设新的生产线),抽象工厂(制定创建产品的接口,让子工厂选择创建哪种产品)在Spring中各种的BeanFactory创建bean都用到了模板模式:定义一个算法骨架或者算法的流程,而不同的实例实现方式不同,将某个或多个具体的实现延迟到子类中,比如RedisTem

2017年1月19日 星期四 --出埃及记 Exodus 22:9_abo1977的博客-程序员秘密

2017年1月19日 星期四 --出埃及记 Exodus 22:9In all cases of illegal possession of an ox, a donkey, a sheep, a garment, or any other lost property about which somebody says, `This is mine,' both parties are ...

【hiho39】二分·归并排序之逆序对_aoe41606的博客-程序员秘密

近期申请了微软的暑假实习,4号就要在线笔试了,在线測试系统用的是http://hihocoder.com/,今天试手做了一道题。【题目】原题链接:http://hihocoder.com/contest/hiho39/problem/1输入第1行:1个整数N,表示...

基于Github的个人博客快速搭建教程_fmbao的博客-程序员秘密

搭建个人博客简明教程(Github+hexo)按照同学搭建个人博客的教程尝试搭建自己的博客(有点绕口,笑),但是发现出现了一点问题,因此在这里将其教程重新写一遍,然后将其中容易出现的地方再点一下。相关技术平台介绍:Hexo是一款基于Node.js的静态博客框架,依赖少、易于安装使用,可以方便的生成静态网页托管在github和heroku上,是搭建博客的首选框架。同时hexo的创建人是台湾...

随便推点

LoadRunner【第三篇】录制脚本实践:订票网站_akb7208的博客-程序员秘密

启动服务安装好loadrunner,我们就可以实践了。loadrunner自带订票网站,可以方便我们练习,先把下面两个发送到桌面快捷方式首先,启动服务,点击下面图标(如果服务无法启动,检查端口是否被占用,参考:Linux及Windows查看占用端口的进程)然后,打开首页,点击下面图标登录的用户名:jojo,密码:bean录制脚本桌面...

Anaconda python 版本对应关系_蜜糖与砒霜的博客-程序员秘密

【转】原文:_沥川往事https://blog.csdn.net/yuejisuo1948/article/details/81043823首先解释一下上表。 anaconda在每次发布新版本的时候都会给python3和python2都发布一个包,版本号是一样的。表格中,python版本号下方的离它最近的anaconda包就是包含它的版本。举个例子,假设你想安装python2.7.14,在...

Android开发学习笔记之设计模式——装饰模式&桥接模式_android 装饰器模式_Yang杰的博客-程序员秘密

文章目录Android开发学习笔记之设计模式——装饰模式&桥接模式装饰模式概述应用场景优缺点实现桥接模式概述应用场景优缺点实现Android开发学习笔记之设计模式——装饰模式&桥接模式装饰模式概述在开发过程中,我们可能会对某个类进行功能扩展,通常情况下,扩展方式存在以下两种:继承:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机;组合:即将一个类的对象嵌入另一

Linux 基础学习(8)-网络配置-Hyper-V 下CentOS虚拟机配置静态ip_num197的博客-程序员秘密

最近使用Windows10中的Hyper-V装了个CentOS6,需要将该虚拟机系统ip设为静态IP,个人学识原因走了很多弯路。在此记录分享。1)本实例所用的各项资源说明,系统是windows10企业版64bit,虚拟机管理器使用自带的Hyper-V管理器,虚拟机安装的系统是CentOS7.如下图所示: 2) 首先创建虚拟交换机。在Hyper-V管理器中的虚拟交换机管理器中新建虚拟交换机...

msp430中如何连续对位进行取反_采用ISRA技术在冷封应用中取得重要竞争优势_weixin_39652760的博客-程序员秘密

ISRA VISION软包装解决方案实时进行连续的质量和工艺控制全球领先的表面检测系统供应商ISRA VISION现推出100%在线检测解决方案PrintSTAR,该系统采用前沿技术,可对印刷图像、复合和涂层进行连续的质量和工艺控制。一家中型包装生产商目前正借助ISRA的技术支持,对软包装上涂布冷封胶粘剂进行100%质量验证和检测。从检测中获得的专业知识可进一步用于改进印刷工艺。如今的包装行业越来...

推荐文章

热门文章

相关标签