API接口安全性设计

摘自:https://blog.csdn.net/qq_21441663/article/details/83473959

接口的安全性主要围绕token、timestamp和sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:

Token授权机制:

用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端的凭证。

时间戳超时机制:

用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效。时间戳超时机制是防御DOS攻击的有效手段。

签名机制:

将 Token 和 时间戳 加上其他请求参数再用MD5或SHA-1算法(可根据情况加点盐)加密,加密后的数据就是本次请求的签名sign,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改。

拒绝重复调用(非必须):

客户端第一次访问时,将签名sign存放到缓存服务器中,超时时间设定为跟时间戳的超时时间一致,二者时间一致可以保证无论在timestamp限定时间内还是外 URL都只能访问一次。如果有人使用同一个URL再次访问,如果发现缓存服务器中已经存在了本次签名,则拒绝服务。如果在缓存中的签名失效的情况下,有人使用同一个URL再次访问,则会被时间戳超时机制拦截。这就是为什么要求时间戳的超时时间要设定为跟时间戳的超时时间一致。拒绝重复调用机制确保URL被别人截获了也无法使用(如抓取数据)。

流程如下:

  • 客户端通过用户名密码登录服务器并获取Token
  • 客户端生成时间戳timestamp,并将timestamp作为其中一个参数。
  • 客户端将所有的参数,包括Token和timestamp按照自己的算法进行排序加密得到签名sign
  • 将token、timestamp和sign作为请求时必须携带的参数加在每个请求的URL后边(http://api.com/users?token=asdsadasd&timestamp=123&sign=123123123)
  • 服务端写一个过滤器对token、timestamp和sign进行验证,只有在token有效、timestamp未超时、缓存服务器中不存在sign三种情况同时满足,本次请求才有效

在以上三中机制的保护下,

如果有人劫持了请求,并对请求中的参数进行了修改,签名就无法通过;

如果有人使用已经劫持的URL进行DOS攻击,服务器则会因为缓存服务器中已经存在签名或时间戳超时而拒绝服务,所以DOS攻击也是不可能的;

如果签名算法和用户名密码都暴露了,那齐天大圣来了估计也不好使吧。。。。

最后说一句,所有的安全措施都用上的话有时候难免太过复杂,在实际项目中需要根据自身情况作出裁剪,比如可以只使用签名机制就可以保证信息不会被篡改,或者定向提供服务的时候只用Token机制就可以了。如何裁剪,全看项目实际情况和对接口安全性的要求~

接口的安全性主要围绕token、timestamp和sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:

Token授权机制:

用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端的凭证。

时间戳超时机制:

用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效。时间戳超时机制是防御DOS攻击的有效手段。

签名机制:

将 Token 和 时间戳 加上其他请求参数再用MD5或SHA-1算法(可根据情况加点盐)加密,加密后的数据就是本次请求的签名sign,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改。

拒绝重复调用(非必须):

客户端第一次访问时,将签名sign存放到缓存服务器中,超时时间设定为跟时间戳的超时时间一致,二者时间一致可以保证无论在timestamp限定时间内还是外 URL都只能访问一次。如果有人使用同一个URL再次访问,如果发现缓存服务器中已经存在了本次签名,则拒绝服务。如果在缓存中的签名失效的情况下,有人使用同一个URL再次访问,则会被时间戳超时机制拦截。这就是为什么要求时间戳的超时时间要设定为跟时间戳的超时时间一致。拒绝重复调用机制确保URL被别人截获了也无法使用(如抓取数据)。

流程如下:

  • 客户端通过用户名密码登录服务器并获取Token
  • 客户端生成时间戳timestamp,并将timestamp作为其中一个参数。
  • 客户端将所有的参数,包括Token和timestamp按照自己的算法进行排序加密得到签名sign
  • 将token、timestamp和sign作为请求时必须携带的参数加在每个请求的URL后边(http://api.com/users?token=asdsadasd&timestamp=123&sign=123123123)
  • 服务端写一个过滤器对token、timestamp和sign进行验证,只有在token有效、timestamp未超时、缓存服务器中不存在sign三种情况同时满足,本次请求才有效

在以上三中机制的保护下,

如果有人劫持了请求,并对请求中的参数进行了修改,签名就无法通过;

如果有人使用已经劫持的URL进行DOS攻击,服务器则会因为缓存服务器中已经存在签名或时间戳超时而拒绝服务,所以DOS攻击也是不可能的;

如果签名算法和用户名密码都暴露了,那齐天大圣来了估计也不好使吧。。。。

最后说一句,所有的安全措施都用上的话有时候难免太过复杂,在实际项目中需要根据自身情况作出裁剪,比如可以只使用签名机制就可以保证信息不会被篡改,或者定向提供服务的时候只用Token机制就可以了。如何裁剪,全看项目实际情况和对接口安全性的要求~

原文地址:https://www.cnblogs.com/GaoAnLee/p/10387345.html

时间: 2024-10-14 04:54:39

API接口安全性设计的相关文章

基于Java的REST架构风格及接口安全性设计的讨论

1.REST即表现层状态传递(Representational [,r?pr?z?n'te?nl] State Transfer,简称REST). (1)REST名词解释: 通俗来讲就是资源在网络中以某种表现形式进行状态转移.分解开来: Resource:所指的不只是数据,而是数据和表现形式的组合: Representational:某种表现形式,比如用JSON,XML,JPEG等: State Transfer:状态变化.通过HTTP动词实现. (2)RESTful API: REST(表述性

移动APP接口安全性设计

移动APP接口是怎么保证安全性的,可以采用https,或者是非对称加密. 接口加密的目的是防止被别人用抓包工具,抓包后篡改数据. 关于加密算法常见的有对称加密(DES)和非对称加密(RSA) 对称加密(DES):加密和解密用的是同一个密钥 import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory

php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restful api 请明白一点,这个只是设计指导思想,也就是设计风格 ,比如你需要遵循这些原则 原则条件REST 指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful.Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的.从客户端到服务

关于网易云音乐爬虫的api接口?

抓包能力有限,分析了一下网易云音乐的一些api接口,但是关于它很多post请求都是加了密,没有弄太明白.之前在知乎看到过一个豆瓣工程师写的教程,但是被投诉删掉了,请问有网友fork了的吗?因为我觉得他写的代码都比较pythonic,符合pep8规范.知乎另外几名大V比如@路人甲虽然经常分享数据,但是很少分享源代码,github也没有公布,公开过的代码我觉得他很多基础的pep8细节都忽略了,而且他的爬虫的效率非常低,比如爬网易10k+评论,在专栏说爬了6个小时之类的很辛苦之类的话,但是看他的代码别

前后端开发过程中API接口管理有哪些痛点?附几种解决方案

一.API管理的痛点 API接口在设计时往往需要编写大量的文档,而且编写完成之后还会经常改动,文档编写维护工作量大. 接口文档编写好后,实际的代码可能会与文档有出入,这个时候文档是不准确的,文档与代码保持修改同步也是一个很大的工作量.随着接口版本的迭代,接口文档需要同步更新.有些时候接口会成为对接双方的开发进度瓶颈,因为接口调用会有依赖,类似app的项目,前端会需要调用后端接口,接口功能不实现会影响前端开发进度.接口开发完以后,做接口测试不方便,特别是接口数量多,参数复杂的情况,测试工作量大.接

API接口设计之 安全性 与 性能

接口安全性: 1. Token验证机制 通过用户名/密码调用授权接口获取Token,设置token有效期保持用户授权期间状态,可以使用token将信息保存在服务端,避免网络间传输,目的在于防止用户信息泄露,存储状态机. 2. 接口调用签名 由于前后端分离前端通过http请求调用后端接口,期间通过网络介质传输接口调用参数,黑客可能通过公共网域监听http请求信息,窃取调用接口参数信息,并从中查询规律,从而不通过客户端,直接通过http直接请求调用接口.这种情况下需要通过签名方式对一些敏感接口进行签

RESTful Api 身份认证安全性设计

REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 HTTP 请求的 Method  之中. 详情可以阅读 http://mengkang.net/620.html . 而这篇文章则主要是讨论 RESTful Api 身份认证安全性设计. 没有绝对的安全,这个话题很深, 下文都是自己的一些理解,水平有限,如有勘误,希望大家予以指正. 由于 RESTfu

如何设计好的RESTful API之安全性

原文:http://blog.csdn.net/ywk253100/article/details/25654101 导读:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证.授权.身份管理等安全需求.如何保证RESTful API的安全性呢. 关键词:RESTful API API安全性 前面讲了好的RESTful API具有的一些特征,本文会继续探讨RESTful API的安全性问题. InfoQ:安全是恒久的话题,

开放接口/RESTful/Api服务的设计和安全方案

总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) 用户身份验证:Token与Session开放接口Api服务其实就是客户端与服务端无状态交互的一种形式,这有点类似REST(Representational State Transfer)风格.普通网站应用一般使用session进行登录用户信息的存储和验证(有状态),而开放接口服务/REST资源请求则