先思考一个问题,你在写集成凋谢的乐娱API接口时是如何保障调用的数据安全性问题?先来看看有哪些安全性问题在凋谢的api接口调用中,咱们通过http Post或者Get形式申请服务器的时候,会面临着那些安全性问题困扰,例如:
申请起源(身份)是否非法?
申请参数被篡改?
申请的唯一性(不可复制)
为了保证数据在通信时的安全性,咱们能够采纳参数签名的形式来进行相干验证。
乐娱Api接口开启对接案列剖析
咱们通过给caichen .cc[挪动端(app)] 写 [后盾接口(api)] 的案例进行剖析:
客户端: 以下简称app
后盾接口:以下简称乐娱api
咱们通过app查问产品列表这个操作来进行剖析:
app中点击查问按钮==》调用api进行查问==》返回查问后果==>显示在app中
上代码啦 -_-!
一、不进行验证的形式
api查问接口:
app调用:http://api.test.com/getproducts?参数1=value1.......
如上,这种形式简略粗犷,通过调用getproducts办法即可获取产品列表信息了,然而 这样的形式会存在很重大的安全性问题,没有进行任何的验证,大家都能够通过这个办法获取到产品列表,导致产品信息泄露。
那么,如何验证调用者身份呢?如何避免参数被篡改呢?
二、MD5参数签名的形式
咱们对api查问乐娱产品接口进行优化:
1.给app调配对应的key、secret
2.Sign签名,调用API 时须要对申请参数进行签名验证,签名形式如下:
a. 依照申请参数名称将所有申请参数依照字母先后顺序排序失去:keyvaluekeyvalue...keyvalue 字符串如:将arong=1,mrong=2,crong=3 排序为:arong=1, crong=3,mrong=2 而后将参数名和参数值进行拼接失去参数字符串:arong1crong3mrong2。 b. 将secret加在参数字符串的头部后进行MD5加密 ,加密后的字符串需大写。即失去签名Sign
新api接口代码:
app调用:http://api.test.com/getproduc...参数1=value1&参数2=value2.......
注:secret 仅作加密应用, 为了保障数据安全请不要在申请参数中应用。
如上,优化后的申请多了key和sign参数,这样申请的时候就须要非法的key和正确签名sign才能够获取产品数据。这样就解决了身份验证和避免参数篡改问题,如果申请参数被人拿走,没事,他们永远也拿不到secret,因为secret是不传递的。再也无奈伪造非法的申请。
然而...这样就够了吗?仔细的同学可能会发现,如果我获取了你残缺的链接,始终应用你的key和sign和一样的参数不就能够失常获取数据了...-_-!是的,仅仅是如上的优化是不够的
申请的唯一性:
为了避免他人重复使用申请参数问题,咱们须要保障申请的唯一性,就是对应申请只能应用一次,这样就算他人拿走了申请的残缺链接也是有效的。
唯一性的实现:在如上的申请参数中,咱们退出工夫戳 :timestamp(yyyyMMddHHmmss),同样,工夫戳作为申请参数之一,也退出sign算法中进行加密。
新的api接口:
app调用:
http://api.test.com/getproduc...参数1=value1&参数2=value2.......
如上,咱们通过timestamp工夫戳用来验证申请是否过期。这样就算被人拿走残缺的申请链接也是有效的。
Sign签名安全性剖析:
通过下面的案例,咱们能够看出,平安的关键在于参加签名的secret,整个过程中secret是不参加通信的,所以只有保障secret不泄露,申请就不会被伪造。
总结
上述的Sign签名的形式可能在肯定水平上避免信息被篡改和伪造,保障通信的平安,这里应用的是MD5进行加密,当然理论应用中大家能够依据理论需要进行自定义签名算法,比方:RSA,SHA等。