【分享】对外API接口安全设计
前言
最近公司业务需要对外提供接口,之前没有什么对外接口开发经验所以最近找了很多文章,恶补了一下对外接口开发知识,这篇算是自己开发接口的一个总结吧。下图我设计接口的大体流程
对外接口的安全问题
1.传输过程的安全
请求报文在网络传输过程中可能会被劫持篡改请求参数信息,导致服务端接收错误的参数。所以我们引入签名机制,就好比一个指纹锁,我需要一个正确的指纹才能打开锁,这里的指纹就是签名。接口请求方根据接口双方约定的签名规则对参数进行签名,即使请求参数被篡改,我们通过双方生成的签名进行验签来拒绝这次请求。生成签名的算法可以使用摘要算法最常用的SHA256。
以上所述我们可以保证请求数据由接口请求方到服务器端的数据不会被篡改,那么服务端返回到接口请求方的数据怎么能保证这个数据是由服务端返回的未被篡改过的数据。这里我的做法通过RSA算法生成公私钥,服务器端保存私钥,线下提供公钥给接口请求方,由接口请求方生成一个自己的密钥secretKey,通过RSA算法用公钥对secretKey进行加密,将加密后的字段通过请求头的方式传给服务端,服务端用私钥解密得到secretKey,在服务端返回数据的时候用AES算法进行加密,接口请求方用自己secretKey进行解密来保证返回数据的安全性。
2.到达服务端的安全
请求到达服务端需要判断这个请求方的身份是否合法。以及是否被DoS攻击。判断身份是否合法我们可以利用token的方式,通过下线分配给接口请求方一个id和密码类似于用户登录的用户名和密码来获取token(token可以是一次性的也可以设置有效时间段),每次请求都带上token,服务端进行身份校验。粗略的防止类似于DoS攻击这样的我们可以引入时间戳的机制,设置请求有效期例如三分钟内的请求有效其它的无效,但是这种方法并不能阻止DoS攻击,三分钟内同样可以使用DoS攻击来使服务器瘫痪。我们可以使用黑名单机制,对这个接口请求方的所有操作都直接返回错误或者拉入IP黑名单。如果对于频繁的接口请求,可以采用限流机制(常见的限流方式有漏斗限流和令牌桶限流算法)。
在对外接口中如果是写入操作我们还需要防止重复写入数据,例如新增数据,我们通常只要新增一条例外一条相同的请求过来我们应该直接返回上次相同的结果而不是再新插入一条数据。关于重复写入数据的问题我采用的最简单的方式就是写入之前先去库里面查一次,如果存在就直接返回,无需继续插入数据。(当然还有更多优化的方式)
同时,也可以使用一些API网关工具如Eolinker配合保护。
使用地址:www.eolinker.com