• 浅谈API安全设计


    一、简述


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

    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×tamp&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)、仅对部分敏感数据做加密(例如账号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。

    摘自:http://www.jianshu.com/p/d7c52d113a68

  • 相关阅读:
    两道挺有意思的思考题
    IEEE浮点数表示法
    MD5 Bump Mapping
    MD5 PolyBump + DetailBump
    DOOM3 MD5渲染方式的另一种猜测
    Relief Mapping
    如何计算投影纹理坐标
    Toon Shading, step 3
    c++数组初始化赋值
    c++重载部分运算符以及输入输出运算符
  • 原文地址:https://www.cnblogs.com/lilunjia/p/7891544.html
Copyright © 2020-2023  润新知