• 保障API接口安全的措施有哪些?
  • 发布于 2个月前
  • 225 热度
    0 评论
简介
APP、前后端分离项目都采用 API 接口形式与服务器进行数据通信,传输的数据被偷窥、被抓包、被伪造时有发生,那么如何设计一套比较安全的 API 接口方案至关重要,一般的解决方案有以下几点:
1.Token 授权认证,防止未授权用户获取数据
2.时间戳超时机制
3.URL 签名,防止请求参数被篡改
4.防重放,防止接口被第二次请求,防采集
5.采用 HTTPS 通信协议,防止数据明文传输

Token 授权认证
因为 HTTP 协议是无状态的,Token 的设计方案是用户在客户端使用用户名和密码登录后,服务器会给客户端返回一个 Token,并将 Token 以键值对的形式存放在缓存(一般是 Redis)中,后续客户端对需要授权模块的所有操作都要带上这个 Token,服务器端接收到请求后进行 Token 验证,如果 Token 存在,说明是授权的请求。

Token 生成的设计要求:
1.应用内一定要唯一,否则会出现授权混乱,A 用户看到了 B 用户的数据;
2.每次生成的 Token 一定要不一样,防止被记录,授权永久有效;
3.一般 Token 对应的是 Redis的key,value 存放的是这个用户相关缓存信息,比如:用户的 id;
4.要设置 Token 的过期时间:过期后需要客户端重新登录,获取新的 Token。如果 Token 有效期设置较短,会反复需要用户登录,体验比较差,我们一般采5.用 Token 过期后,客户端静默登录的方式,当客户端收到 Token 过期后,客户端用本地保存的用户名和密码在后台静默登录来获取新的 Token,还有一种是单独出一个刷新 Token 的接口,但是一定要注意刷新机制和安全问题;

根据上面的设计方案要求,我们很容易得到 Token=md5(用户ID + 登录的时间戳 + 服务器端秘钥)这种方式来获得 Token。因为用户 ID 是应用内唯一的,登录的时间戳保证每次登录的时候都不一样,服务器端秘钥是配置在服务器端参与加密的字符串(即:盐),目的是提高 Token 加密的破解难度,注意一定不要泄漏。

时间戳超时机制
客户端每次请求接口都带上当前时间的时间戳 timestamp,服务端接收到 timestamp 后跟当前时间进行比对,如果时间差大于一定时间(比如:1 分钟),则认为该请求失效。时间戳超时机制是防御 DOS 攻击的有效手段。例如
http://url/getInfo?id=1&timetamp=1661061696

URL 签名
写过支付宝或微信支付对接的同学肯定对URL签名不陌生,我们只需要将原本发送给server端的明文参数做一下签名,然后在server端用相同的算法再做一次签名,对比两次签名就可以确保对应明文的参数有没有被中间人篡改过。例如
http://url/getInfo?id=1&timetamp=1559396263&sign=e10adc3949ba59abbe56e057f20f883e

签名算法过程
首先,对通信的参数按 key 进行字母排序放入数组中(一般请求的接口地址也要参与排序和签名,那么需要额外添加 url=http://url/getInfo 这个参数);

对排序完的数组键值对用&进行连接,形成用于加密的参数字符串。


在加密的参数字符串前面或者后面加上私钥,然后用 md5 进行加密,得到 sign,然后随着请求接口一起传给服务器。服务器端接收到请求后,用同样的算法获得服务器的 sign,对比客户端的 sign 是否一致,如果一致请求有效。

防重放
客户端第一次访问时,将签名 sign 存放到服务器的 Redis 中,超时时间设定为跟时间戳的超时时间一致,二者时间一致可以保证无论在 timestamp 限定时间内还是外  URL 都只能访问一次,如果被非法者截获,使用同一个 URL 再次访问,如果发现缓存服务器中已经存在了本次签名,则拒绝服务。

如果在缓存中的签名失效的情况下,有人使用同一个 URL 再次访问,则会被时间戳超时机制拦截,这就是为什么要求 sign 的超时时间要设定为跟时间戳的超时时间一致。拒绝重复调用机制确保 URL 被别人截获了也无法使用(如抓取数据)。

方案流程:
1.客户端通过用户名密码登录服务器并获取 Token;
2.客户端生成时间戳 timestamp,并将 timestamp 作为其中一个参数;
3.客户端将所有的参数,包括 Token 和 timestamp 按照自己的签名算法进行排序加密得到签名 sign;
4.将 token、timestamp 和 sign 作为请求时必须携带的参数加在每个请求的URL后边,例:http://url/request?token=h40adc3949bafjhbbe56e027f20f583a&timetamp=1559396263&sign=e10adc3949ba59abbe56e057f20f883e
5.服务端对 token、timestamp 和 sign 进行验证,只有在 token 有效、timestamp 未超时、缓存服务器中不存在 sign 三种情况同时满足,本次请求才有效。

采用 HTTPS 通信协议
安全套接字层超文本传输协议 HTTPS,为了数据传输的安全,HTTPS 在 HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并为客户端和服务器之间的通信加密。

HTTPS 也不是绝对安全的,比如中间人劫持攻击,中间人可以获取到客户端与服务器之间所有的通信内容。
用户评论