先思考一个问题,你在写集成凋谢的乐娱 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 等。