如何保证API接口的安全性

怎样防重放攻击

重放攻击:所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。比如黑客通过抓包获取到了请求的HTTP报文,然后黑客自己编写了一个类似的HTTP请求,发送给服务器

timestamp、nonce主要针对每个API保持唯一性

基于时间戳(timestamp)的方案

每次HTTP请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行数字签名。因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间相比较,是否超过了60s,如果超过了则认为是非法的请求。

http://baidu.com/index/Info?uid=ZX07&stime=14232323&sign=128728364892304dhfj92932 如果黑客修改stime参数为当前的时间戳,则sign参数对应的数字签名就会失效,因为黑客不知道token值,没有办法生成新的数字签名

🌑存在的问题: 黑通过抓包发送请到服务端求一般都会超过60S了,但是如果是在60s之内进行重放攻击,那就没办法了,所以这种方式不能保证接口被多次调用。

基于nonce的方案

nonce(Number once)的意思是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同,所以该参数一般与时间戳有关,服务端会把每一次请求的nonce保存到数据
工作流程:每次处理HTTP请求时,首先判断该请求的nonce参数是否在服务端数据库中,如果存在则认为是非法请求

让我们看一个实际的列子:

http://baidu.com/index/Info?uid=ZX07&nonce=53sdkjskd&sign=128728364892304dhfj92932 nonce参数在首次请求时,已经被存储到了服务器上的“集合”中,再次发送请求会被识别并拒绝。 nonce参数作为数字签名的一部分,是无法篡改的,因为黑客不清楚token,所以不能生成新的sign。
🌑存在的问题: 那就是对服务器来说永久存储所有接收到的nonce的代价是非常大的

[最佳方案]基于timestamp和nonce的方案

nonce的一次性可以解决timestamp参数时间限制的问题,timestamp可以解决nonce参数在数据库“集合”越来越大的问题。在timestamp方案的基础上,加上nonce参数,因为timstamp参数对于超过60s的请求,都认为非法请求,所以我们只需要存储60s的nonce参数的“集合”即可

让我们看一个实际的列子:

http://baidu.com/index/Info?uid=ZX07&stime=34334232323&nonce=53sdkjskd&sign=128728364892304dhfj92932 # 如果在60s内,重放该HTTP请求,因为nonce参数已经在首次请求的时候被记录在服务器的nonce参数“集合”中,所以会被判断为非法请求。 超过60s之后,stime参数就会失效,此时因为黑客不清楚token的值,所以无法重新生成签名

如何正确生成timestamp

问题:由于服务器的时间和客户端的时间是存在时间差的,所以客户端时间必须和服务端时间做校验

先请求服务器上的时间 ServerTime,然后记录下来,同时记录当前的时间 LocalTime1,当下次请求接口的时候,最新的时间即是:LocalTime2 - LocalTime1 + ServerTime

  • App启动后通过接口获取服务器时间 ServerTime,保存本地。并同时记录当前时间 LocalTime1
  • 获取当前时间:LocalTime2(当前本地时间) - LocalTime1 + ServerTime

怎样防篡改攻击

签名机制

算法:signature(签名) = MD5算法(token+timestamp+nonce+业务参数)

将“API接口中的token、timestamp、nonce、业务参数'进行MD5算法加密,加密后的数据就是本次请求的签名signature,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。

具体流程:

  • 请求参数包括token、timestamp、nonce、业务参数、客户端signature(签名)
  • 将token、timestamp、nonce、业务参数以字母升序(A-Z)排序,按'key1=value1'+ '&' + 'key2=value2'连接所有参数得到字符串signStr
  • 将字符串signStr进行MD5运行得到新的签名newSignature
  • newSignature和客户端发送的signature做比较

OAuth2.0

如果接口属于开放的API,则适合使用OAuth2.0的认证机制来处理。

  • 用来代替密码,供第三方应用使用,需要用户授权
  • 应用通过凭证(Access Token)向资源服务器请求相关资源

HTTPS

HTTPS:HTTPS在HTTP的基础上添加了TSL/SSL安全协议,不过,HTTPS也不是绝对安全的,也存在被劫持的可能,但相对HTTP毋庸置疑是更加安全的

🌑缺点: 服务器对HTTPS的配置相对有点复杂,还需要到CA申请证书,而且一般还是收费的。而且,HTTPS效率也比较低。一般,只有安全要求比较高的系统才会采用HTTPS,比如银行。而大部分对安全要求没那么高的App还是采用HTTP的方式

IP白名单

仅允许IP白名单内的IP访问,其余的IP均不允许访问,可用于鉴权,防止代理ip被乱用,个人目前还未曾过多涉及,所以不做更多阐述。

总结

只有在token有效、timestamp未超时、缓存服务器中不存在nonce三种情况同时满足,接口请求才有效。服务端可以写一个过滤器对token、timestamp和nonce进行过滤和验证

(0)

相关推荐

  • 微信公众号开发之配置服务器

    入口: 附上官方文档 详情的官方文档里面都有,我这边只写一些自己的理解,欢迎补充 URL: 是开发者用来接收微信消息和事件的接口URL,必须以http://或https://开头,只能是80 和 44 ...

  • 拒绝接口裸奔!开放API接口签名验证!

    接口安全问题 请求身份是否合法? 请求参数是否被篡改? 请求是否唯一? AccessKey&SecretKey (开放平台) 请求身份 为开发者分配AccessKey(开发者标识,确保唯一)和 ...

  • 一晚上,搞出来一个微信订阅号鉴黄机器人

    领取大佬们推荐的学习资料 顾名思义,我们就是来做一个订阅号机器人,大致是这样一个过程 公众号接收用户消息 -> 微信平台发送消息给我们的服务器 -> 我们的服务器处理消息 -> 返回 ...

  • HTTP认证之摘要认证

    导航 HTTP认证之基本认证--Basic(一) HTTP认证之基本认证--Basic(二) HTTP认证之摘要认证--Digest(一) HTTP认证之摘要认证--Digest(二) 一.概述 Di ...

  • 国际象棋云库API接口说明

    概述 国际象棋云库(简称'云库') API 接口分为两部分,访问云库,可以直接通过基于 HTTP 的 RESTful API 实现. 此外,在原有的 UCI 引擎通讯协议上扩展了云库相关的指令,云库. ...

  • 中国象棋云库API接口说明

    中国象棋云库API接口说明 概述 中国象棋云库(简称'云库') API 接口分为两部分,访问云库,可以直接通过基于 HTTP 的 RESTful API 实现. 此外,在原有的 UCI 引擎通讯协议上 ...

  • 盘点15个好用的API接口管理神器

    分布式实验室 1周前 如今,API已在软件.Web和移动应用程序开发领域无处不在,从企业内部到面向公众的应用以及与合作伙伴进行系统集成.通过使用API,开发人员可以创建满足各种客户需求的应用程序.而软 ...

  • IOT语义互操作性之API接口

    这个系列文章描述了一个单一的语义数据模型来支持物联网和建筑.企业和消费者的数据转换. 这种模型必须简单可扩展, 以便能够在各行业领域之间实现插件化和互操作性. 对于一个目前从事智能硬件的老码农,觉得这 ...

  • 微服务架构下的API接口驱动开发,设计和集成

    今天谈下在微服务架构下,接口设计和开发方面的思考. 对于微服务架构,SOA和Http Rest API接口设计,在我前面的头条文章中均有专门的说明,因此对于基础方面的解释在本文不再重复.对于今天要写的 ...

  • 全字段多条件搜索(api接口)

    近期在做项目时遇到了一个全表全字段多条件搜索的需求,在平时搜索最常见的就是 字段+like +'% 条件%'这种模式,但遇到多条件多字段时,这种就不适用了. 表字段已知,条件未知,条件数量未知,这种情 ...

  • python接口自动化21-规范的API接口文档示例

    前言 接口文档到底长啥样?做接口测试最大的障碍在于没有接口文档,很多公司不注重接口文档的编写,导致测试小伙伴没见过接口文档. 运气好一点的测试小伙伴可能厚着脸皮找开发要过接口文档,然而拿过来的接口文档 ...

  • API 接口四连问!问你怕不怕!

    回复'架构师'获取资源 在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安 ...

  • 如何设计API接口,实现统一格式返回?

    目录 前言 接口交互 返回格式 控制层Controller 美观优化 优雅优化 实现方案 总结 前言 在移动互联网,分布式.微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外 ...