一种可靠的API安全验证设计方案
文档更新说明
- 最后更新 2016年05月10日
- 首次更新 2016年05月10日
前言
本文将会介绍一种服务端针对客户端发起的POST(GET)请求如何进行合法性验证的解决方案.适用与安卓和iOS上使用.用一句话总结其原理,就是参数与私钥混合进行一次签名,服务端将对每一次请求的签名做校验,以此来确定请求是否合法.这种方式可以从支付宝支付接口看到,当然支付宝的支付接口的安全性验证肯定要比本文介绍的复杂.不过一般来说本文的方法也适合普通项目的.
普通接口存在的问题
如果说一个接口并没有做任何安全性校验,那么任何一个人只要捕获到了客户端向服务器发起的请求,同样的模仿一下请求,改改请求的参数.例如用户在修改资料,这是破坏着捕获到修改资料的请求后,把参数里的名字改成🐷,再POST给服务器,这样服务器是完全不知道这是恶意行为.所以针对接口,肯定是需要做安全校验.
原理
从上一节可以看出,修改参数可以再次POST到服务器,那么说明我们要对参数做一个校验,确保POST的过程中传递的参数都是客户端合法发出的,一旦第三者恶意修改参数内容,服务器就可以识别出来了.
解决方案
根据上一节的原理,给出简单的解决方案.例如现在需要POST参数b=2&a=1&c=3&time=111到服务器.我们可以先对参数做某种排序,例如升序,变成a=1&b=2&c=3&time=111,然后在结合私钥字符串,合并起来做一个sha256运算.类似这样
sha256("a=1&b=2&c=3&time=111:ImKey")
其中Imkey是私钥.这样运算后可以得到一个加密过的字符串8364dfc413115fcda25ff0b3403fe157a4099862ee1750365253ea3bcbf3c29b,再把这个字符串放进参数里一起POST,类似这样
a=1&b=2&c=3&time=111&sign=8364dfc413115fcda25ff0b3403fe157a4099862ee1750365253ea3bcbf3c29b.
这样服务端收到后,就按照同样的规则对参数除sign外的进行排序,再验证一下sign是否匹配,以此来确定请求是否合法.
无法避免的问题
上面基本上就讲述完了一个最基本的API安全性校验的方案了.当然如果客户端被破解了,别人拿到了私钥后也就可以对服务器发起随意请求了.所以安全问题是很难杜绝的,只有只能根据实际场景,适当加强破解的难度了.😃