接口设计-安全
概述
本文介绍几种对外接口的安全性设计
要求
-
传输过程中不泄漏
-
传输结果可被识别
方案
数据加密
概念:针对数据传输过程中容易被抓包的问题,对关键信息进行加密操作
方案
-
关键信息加密,例如对密码进行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