接口设计-安全

接口设计-安全

概述

本文介绍几种对外接口的安全性设计

要求

  • 传输过程中不泄漏

  • 传输结果可被识别

方案

数据加密

概念:针对数据传输过程中容易被抓包的问题,对关键信息进行加密操作

方案

  • 关键信息加密,例如对密码进行MD5加密

  • 通过对消息的结构化,对返回内容进行加密

  {
    code:200,
    message:"success"
    data:{
      //返回时对data内容进行加密   
    }
  }
  • 将HTTP 改为 HTTPS

数据加签/验签

概念

接口双方为了确保数据参数在传输过程中未经过篡改,对接口数据进行加签,在接口服务器端对接口参数进行验签,确保签名一致,验签通过之后再进行业务逻辑处理。

要点

  • 使用密钥算法(RSA)生成公钥与私钥

  • 将公钥提供给数据提供方,用于验签

  • 使用私钥对请求参数进行加签操作

时间戳

概念

针对请求重复的情况,不接收来自同一客户端的时间间隔很短的同一请求

要点

  • 客户端给参数添加请求时间

  • 服务器在接收到请求之后生成接收时间

  • 请求时间 - 接收时间 > 60S 认为请求重复

缺点

  • 因为需要考虑网络等因素,所以一般为间隔时间不会太短,所以在时间间隔以内任可能重复请求

  • 该方案要求服务器时间与客户端时间必须同步,一点点的差异都可能导致请求不到结果

Token

概念

针对请求重复的情况,判断当前请求中的标识是否已存在,如果存在则直接返回

要点

  • 请求方生成全局唯一标识并添加在请求之中

  • 接收方接收到请求获取标识

  • 判断标识在缓存当中是否存在,如果不存在则继续,存在则直接返回

问题

  • 随着请求量的不断增加,缓存当中的 token 会越来越多,所以需要设定一个合理的过期时间

限流

概念

通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统

方案

应用层限流

Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可,

令牌桶算法

请求必须拿到令牌才代表消费成功。而“令牌数”有一个初始值,令牌桶也有一个令牌存储上限,当桶中的令牌耗光后,令牌桶会以自定义的速度生产令牌,此时所有的水(用户请求)会进入阻塞状态,阻塞时间内如果得到了令牌就会消费成功,如果阻塞时间过了还没有得到令牌,请求会被抛弃,典型就是Nginx的限流

漏斗算法

请求进入漏斗里,漏斗以一定的速度出水。当水流入的速度过大也就是漏斗满了的话,直接进行溢出

黑白名单

概念

校验数据请求方的标识,判断请求者是否处于白名单,否则直接返回

要点

  • 最常见的请求方标识为请求方的IP地址,除白名单内的IP地址之外的所有访问都不可达

数据校验

对请求内容进行合法性校验,例如:手机号、身份证、是否必填等

要点

  • 采用Spring Validate进行参数校验

  • 对特殊信息进行校验,例如:sql注入

  • 对业务信息进行校验,例如:购买数量不能为0

数据幂等

概念

保证数据N次变换与一次变换的结果相等

乐观锁

在修改的时候添加版本控制

update 表 set 字段 = 值,版本号 = 版本号 + 1 where 版本号 = 查询版本号

单独的去重表

利用数据库的唯一键特性

在查询数据时给数据行新生成一个唯一主键,修改数据时在去重表一行,如果添加失败,就需要重新去查询数据做本地更新

这个去重表也可以作为修改日志来用,需要数据会滚的时候查询上一次修改信息

分布式锁

  • 要求

    • 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行

    • 高可用的获取锁与释放锁

    • 高性能的获取锁与释放锁

    • 具备可重入特性:子程序在执行过程之中,可再次进入

    • 防止锁失效机制:防止死锁

    • 非阻塞锁特性:没有获取到锁将直接返回获取锁失败。

  • 实现

    • 基于数据库表

      • 概念:建立一个方法表,当需要调用相关方法是,则去数据库查询这个方法是否已被占用

      • 要点:需要对方法名字段进行唯一键约束

      • 缺点:没有失效时间、非阻塞、非重入

    • 基于 Redis 开发分布式锁

      • 概念:主要是利用Redis的 setNX 方法实现

      • 缺点:当Redis为主从时存在明显问题,即主服务器宕机之后任然有可能从新选举的主服务器中拿到锁

    • 基于 Zookeeper 开发分布式锁

      • 概念:利用 Zookeeper 的临时顺序节点,每次去判断当前节点时候处于最前位置

      • 缺点:性能较差,因为需要不断的动态去创建节点

接口攻击

防止篡改攻击

在客户端与服务端请求交互的过程中,请求的数据容易被拦截并篡改

方案

加签 + 验签

防止重放攻击

指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通过程中都可能发生,是计算机世界黑客常用的攻击方式之一。

方案

时间戳 + Token

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值