浅谈API安全设计

作者: 8a0b9df8a2dd | 来源:发表于2016-03-20 17:26 被阅读11971次

一、简述

安全是恒久的话题,如果不注意防范,会带来很严重的后果。比如:

1.接口被大规模调用消耗系统资源,影响系统的正常访问,甚至系统瘫痪

2.数据泄露

3.伪造(篡改)数据,制造垃圾数据

4.App被仿制…

那么我们设计API时,就要保证RESTful API的安全性,主要包括三大方面:

a) 对受限资源的登录授权

b) 对请求做身份认证,并且防止篡改,重放攻击

c) 对敏感的数据做加密

二、受限资源的登录授权

此流程不是本文重点,不赘述,基本流程如下:

1. 客户端提交账号信息(用户名+密码)到服务端

2.  服务端验证成功,返回AccessToken给客户端存储

3.访问受限资源时,客户端带入AccessToken就可访问。

三、请求认证

如果不对请求进行签名认证,那么可以简单的通过fiddler等工具轻易抓包拿到数据,并进行篡改,提交,大规模批量调用,则会使系统产生大量垃圾数据,系统资源被大量消耗,甚至无法正常使用(另说,当然可以通过GateWay进行限流),因而我们需要对请求进行签名认证。

URL格式

URL:schema://domain/path?query&imei&timestamp&sign

参数说明

签名方法


sign=signature(path?query&imei&timetamp&SIGN_KEY)

验证过程

认证逻辑

1、初始时,服务端存有各App版本的SIGN_KEY,客户端存有对应版本的SIGN_KEY

2、当要发送请求之前,通过签名方法加密,得到一个sign

3、发送请求的时候,连同sign一起发送给服务器端

4、服务器端首先验证时间戳timestamp是否有效,比如是服务器时间戳5分钟之前的请求视为无效;

5、然后取对应版本的SIGN_KEY验证sign是否合法

6、为了防止重放攻击,需要检查sign是否在redis中存储,如不存在则存入redis(缓存5分钟)

如何防止数据篡改

这里通过签名参数中包含原有请求的所有参数,改动任意参数,sign值都会不同,因此无法篡改。

如何防止重放攻击

由于签名算法中还有imei(设备唯一Id)、timestamp参数,且签名算法为不可逆算法(如md5或sha1),因而对于正常的每个请求sign值不会重复。此时服务端可以存储5分钟的sign值,来做重放攻击时的验证过滤,超过5分钟的请求则直接被timestamp校验过滤。

总结

如此便实现了请求认证,防止数据篡改,重放攻击,但是需要确保App密钥(SIGN_KEY)的安全保存,其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担。

四、敏感据加密

1)、部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。

2)、仅对部分敏感数据做加密(例如账号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。

相关文章

  • 浅谈API安全设计

    一、简述 安全是恒久的话题,如果不注意防范,会带来很严重的后果。比如: 1.接口被大规模调用消耗系统资源,影响系统...

  • RESTful api接口安全优雅设计

    RESTful api接口安全优雅设计 ...

  • 2020-07-02

    浅谈 浅谈模块设计宏内核 浅谈接口设计Flags 浅谈稳定性设计重试 浅谈人员业务结构设计矩阵式 浅谈接口设计 |...

  • API安全设计

    方案一 (客户端token方式)客户端生成token传给服务端校验,一致就通过用户验证。 通过时间戳+用户唯一标识...

  • 浅谈API的设计及其安全性

    看起来好像前后端分离是个浪潮,原来只有APP客户端会考虑这些,现在连Web都要考虑前后端分离 。这里面不得不谈的就...

  • API安全机制

    为什么要保证API安全 防止别人随便调用你的api 保证传输数据的安全 设计签名 防止别人调用你的API其实并不难...

  • 分析RESTful API安全性及如何采取保护措施

    本文中讨论了API安全性和采用安全措施的重要性,如身份验证,API密钥,访问控制和输入验证。 API设计的第一步是...

  • API接口安全性设计

    API接口安全性设计 接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据...

  • Resuful Api如何做身份认证和权限验证

    1:基于cookie2:基于token 参考链接:阿里研究员谷朴:API 设计最佳实践的思考REST API 安全...

  • Java8 时间日期API

    1. 新日期API 原时间API存在的问题:线程安全问题、设计混乱 本地化日期APIjava.time (JDK ...

网友评论

  • uncochen:我这里有个问题,如果采用不可逆的签名算法,那怎么验证时间戳的有效性呢,因为前后端的时间戳肯定是存在一个小的时间间隔的
    uncochen:@江湖一键飘 好的 谢谢
    8a0b9df8a2dd:时间戳是作为明文传递到服务端的,验证时间戳只要客户端与服务端的误差范围在合理范围内(如5min)都合法
  • c5f79064d585:这个过程究竟怎么实现,有没有相应的文章呢?我要在网上搜的话,关键字是什么?有知道的么?
  • b05ef00f2473:我也用的同样的方式,感觉并不好,我尝试过东方时尚驾校的app接口,感觉他们设计的不错,但是不知道他们怎么做到的
    8a0b9df8a2dd:@lsn 可以谈谈这种方式的缺点呢
  • zhuhf:移动对外开放的api基本也是这个思路,顶!
  • 胡一飘:认证逻辑 这一块,我最近也是想这样做的,哈哈哈,不知道是否可以交流下!
    8a0b9df8a2dd:@胡一飘 欢迎交流
  • 不是谢志伟:学习囖
  • 满天丿星:App密钥(SIGN_KEY)的安全保存,有好的方法吗?上面说的我们都做了,就是担心APP密钥泄露,导致接口被别人恶意调用
    ad3e8a094b6d:@江湖一键飘 只要走网络了就有风险,就算用了Https也一样,都有被截获的可能
    满天丿星:@江湖一键飘 我们的密钥其中一个就是Https的证书,证书怎么在应用中安全存放
    8a0b9df8a2dd:@满天丿星 可以通过HTTPS从服务端获取
  • 8a0b9df8a2dd:sessionId频控
  • 8a0b9df8a2dd:可以结合nginx做IP频控
  • 小阳撒:求深入,我做服务端的开发,感觉安全性真的需要个标准规划,现在也还在研究中各种方案中

本文标题:浅谈API安全设计

本文链接:https://www.haomeiwen.com/subject/edqklttx.html