服务端对外开放API接口,尤其对移动应用开放接口的时候,更需要关注接口安全性的问题,要确保应用APP与API之间的安全通信,防止数据被恶意篡改等攻击。
根据业务特点,采用的安全策略也不全相同。当然大多数安全策略更多的都是提高安全门槛,并不能保证100%的安全,但该做的还是不能少。下面就简单列举几种措施来对付接口安全问题。
HTTPS
HTTPS能够有效防止中间人攻击,有效保证接口不被劫持,对数据窃取篡改做了安全防范。但HTTP升级HTTPS会带来更多的握手,而握手中的运算会带来更多的性能消耗。这也是不得不考虑的问题。
Token机制
开放接口时最基本需要考虑到接口不应该被别人随意访问,而我也不能随意访问到其他用户的数据,从而保证用户与用户之间的数据隔离。这个时候我们就有必要引入Token机制了。
具体的做法: 在用户成功登录时,系统可以返回客户端一个Token,后续客户端调用服务端的接口,都需要带上Token,而服务端需要校验客户端Token的合法性。Token不一致的情况下,服务端需要拦截该请求。
对数据进行校验
服务端从某种层面来说需要验证接受到数据是否和客户端发来的数据是否一致,要验证数据在传输过程中有没有被注入攻击。这时候客户端和服务端就有必要做签名和验签。
具体的做法: 客户端对所有请求服务端接口参数做加密生成签名,并将签名作为请求参数一并传到服务端,服务端接受到请求同时要做验签的操作,对称加密对请求参数生成签名,并与客户端传过来的签名进行比对,如签名不一致,服务端需要拦截该请求
签名和加密流程:
1.将请求参数按照a-z排序后,用key=value&key=value拼接,得到待签名字符串;
2.使用自己的私钥,将待签名字符串进行RSA签名,得到签名参数sign;
3.将所有参数转化为json字符串,得到所有参数json字符串明文info;
4.随机生成16位的AES密钥key,用AES加密明文info,得到密文data参数;
5.将AES密钥key,使用别人的公钥RSA加密,得到密文dataKey参数;
示例:
原始请求:www.baidu.com?bbb=222&aaa=111;
1.参数排序后:aaa=111&bbb=222
2.RSA签名得到sign=OCr1gGGlPi9jDOUhTmIRdgQuWgHPZcokhuIDs
3.参数json字符串:{"sign":"OCr1gGGlPi9jDOUhTmIRdgQuWgHPZcokhuIDs","aaa":111,"bbb":"222"}
4.data=C8BkH63OOEVy
5.dataKey=IF4z2fxeGLOgtd
过载保护
服务端仍然需要识别一些恶意请求,防止接口被一些丧心病狂的人玩坏。对接口访问频率设置一定阈值,对超过阈值的请求进行屏蔽及预警。
异常封装
服务端需要构建异常统一处理框架,将服务可能出现的异常做统一封装,返回固定的code与msg,防止程序堆栈信息暴露。
网友评论