api接⼝签名验证(MD5)
你在写开放的API接⼝时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接⼝中,我们通过http Post或者Get⽅式请求服务器的时候,会⾯临着许多的安全性问题,例如:
1. 请求来源(⾝份)是否合法?
2. 请求参数被篡改?
3. 请求的唯⼀性(不可复制)
为了保证数据在通信时的安全性,我们可以采⽤参数签名的⽅式来进⾏相关验证。
案列分析
我们通过给某 [移动端(app)] 写 [后台接⼝(api)] 的案例进⾏分析:
客户端:以下简称app
后台接⼝:以下简称api
我们通过app查询产品列表这个操作来进⾏分析:
app中点击查询按钮==》调⽤api进⾏查询==》返回查询结果==>显⽰在app中
上代码啦 -_-!
⼀、不进⾏验证的⽅式
api查询接⼝:
如上,这种⽅式简单粗暴,通过调⽤getproducts⽅法即可获取产品列表信息了,但是这样的⽅式会存在很严重的安全性问题,没有进⾏任何的验证,⼤家都可以通过这个⽅法获取到产品列表,导致产品信息泄露。
那么,如何验证调⽤者⾝份呢?如何防⽌参数被篡改呢?
⼆、MD5参数签名的⽅式
我们对api查询产品接⼝进⾏优化:
1.给app分配对应的key、secret
2.Sign签名,调⽤API 时需要对请求参数进⾏签名验证,签名⽅式如下:
a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvalue  字符串如:将
arong=1,mrong=2,crong=3 排序为:arong=1, crong=3,mrong=2  然后将参数名和参数值进⾏拼接得到参数字符串:arong1crong3mrong2。
b. 将secret加在参数字符串的头部后进⾏MD5加密 ,加密后的字符串需⼤写。即得到签名Sign
新api接⼝代码:
注:secret 仅作加密使⽤, 为了保证数据安全请不要在请求参数中使⽤。
如上,优化后的请求多了key和sign参数,这样请求的时候就需要合法的key和正确签名sign才可以获取产品数据。这样就解决了⾝份验证和防⽌参数篡改问题,如果请求参数被⼈拿⾛,没事,他们永远也拿不到secret,因为secret是不传递的。再也⽆法伪造合法的请求。
签名字符串是什么但是...这样就够了吗?细⼼的同学可能会发现,如果我获取了你完整的链接,⼀直使⽤你的key和sign和⼀样的参数不就可以正常获取数据了...-_-!是的,仅仅是如上的优化是不够的
请求的唯⼀性:
为了防⽌别⼈重复使⽤请求参数问题,我们需要保证请求的唯⼀性,就是对应请求只能使⽤⼀次,这样就算别⼈拿⾛了请求的完整链接也是⽆效的。
唯⼀性的实现:在如上的请求参数中,我们加⼊时间戳:timestamp(yyyyMMddHHmmss),同样,时间戳作为请求参数之⼀,也加⼊
sign算法中进⾏加密。
新的api接⼝:
如上,我们通过timestamp时间戳⽤来验证请求是否过期。这样就算被⼈拿⾛完整的请求链接也是⽆效的。
Sign签名安全性分析:
通过上⾯的案例,我们可以看出,安全的关键在于参与签名的secret,整个过程中secret是不参与通信的,所以只要保证secret不泄露,请求就不会被伪造。
总结
上述的Sign签名的⽅式能够在⼀定程度上防⽌信息被篡改和伪造,保障通信的安全,这⾥使⽤的是MD5进⾏加密,当然实际使⽤中⼤家可以根据实际需求进⾏⾃定义签名算法,⽐如:RSA,SHA等。
No Excuse~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。