不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如:
- 请求来源(身份)是否合法?
- 请求参数被篡改?
- 请求的唯一性(不可复制)
为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证。
案列分析
我们通过给某 [移动端(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/getproducts?key=app_key&sign=BCC7C71CF93F9CDBDB88671B701D8A35&参数1=value1&参数2=value2.......
注:secret 仅作加密使用, 为了保证数据安全请不要在请求参数中使用。
如上,优化后的请求多了key和sign参数,这样请求的时候就需要合法的key和正确签名sign才可以获取产品数据。这样就解决了身份验证和防止参数篡改问题,如果请求参数被人拿走,没事,他们永远也拿不到secret,因为secret是不传递的。再也无法伪造合法的请求。
但是...这样就够了吗?细心的同学可能会发现,如果我获取了你完整的链接,一直使用你的key和sign和一样的参数不就可以正常获取数据了...-_-!是的,仅仅是如上的优化是不够的
请求的唯一性:
为了防止别人重复使用请求参数问题,我们需要保证请求的唯一性,就是对应请求只能使用一次,这样就算别人拿走了请求的完整链接也是无效的。
唯一性的实现:在如上的请求参数中,我们加入时间戳 :timestamp(yyyyMMddHHmmss),同样,时间戳作为请求参数之一,也加入sign算法中进行加密。
新的api接口:
app调用:
http://api.test.com/getproducts?key=app_key&sign=BCC7C71CF93F9CDBDB88671B701D8A35×tamp=201603261407&参数1=value1&参数2=value2.......
如上,我们通过timestamp时间戳用来验证请求是否过期。这样就算被人拿走完整的请求链接也是无效的。
Sign签名安全性分析:
通过上面的案例,我们可以看出,安全的关键在于参与签名的secret,整个过程中secret是不参与通信的,所以只要保证secret不泄露,请求就不会被伪造。
总结
上述的Sign签名的方式能够在一定程度上防止信息被篡改和伪造,保障通信的安全,这里使用的是MD5进行加密,当然实际使用中大家可以根据实际需求进行自定义签名算法,比如:RSA,SHA等。
源码下载:
源代码:http://git.oschina.net/daimali/Daimali.ISV
欢迎关注个人技术类公众号CodeL
相关推荐
包含翻译后的API文档:zt-exec-1.9-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.zeroturnaround:zt-exec:1.9; 标签:zeroturnaround、zt、exec、中文文档、jar包、java; 使用方法:解压翻译后的API文档,...
包含翻译后的API文档:zt-exec-1.9-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.zeroturnaround:zt-exec:1.9; 标签:zeroturnaround、zt、exec、中英对照文档、jar包、java; 使用方法:解压翻译...
ZT短信平台接口开发文档
Android 请求 WebAPI的案例,博客有些地方解释的不够清楚,所以上传了这个案例。方便学习。
斑马打印机 ZT411 ZT421中文手册
ZTAdmin 是一项软件定义的网络服务,无论您在何处,都可以在所有计算机之间创建可扩展的安全P2P虚拟网络。... ##当前功能:由于ZeroTier API已更改并且该工具以前不是非常模块化,因此我正在对该工具进行
ZT213LEEA,国外找到的数据手册。
ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机
斑马打印机,Java调用官方API架包及调用样例,需要JDK版本1.6及以上,最好在1.6版本下运行。官方提供的API为ZSDK_API.jar
3电动读卡器驱动接口(ZT_IDC.DLL) 4加密键盘驱动接口(ZT_EPP.DLL) 6纸币器(ZT_BILL.DLL) 7凭条(即热敏)打印机(ZT_RECEIPT.DLL) 8发票打印机驱动接口(ZT_INVOICE.DLL) 9ZT416刷卡器(ZT_416.DLL) 10 ZT684Sam卡(ZT684....
斑马打印机ZT210用户指南
WTMDK2101-ZT1 主要包含 WTM2101-S1 核心板接口,驻极体麦克风接口,音频模块接 口(如 ES8156/ES8311/ES8388/MAX98357 等),USB 串口,耳机接口,电池接口,电源监 测及控制接口等。 WTMDK2101-ZT1 评估板,可用于...
斑马zt410驱动是由斑马官方推出的打印机驱动程序,如果你的打印机与电脑的连接出现了异常而导致打印机无法正常的使用,下载此驱动能帮你很好的解决这个问题,欢迎购买了此型号打印机的朋友下载使用!斑马zt410打印机...
这款RS485通信芯片zt13085e用的不多,网上很少这款的原理图库和PCB库,自己画了一个。
ZT213/ZT213LEEA USB多通道收发/驱动芯片规格书V2.10及手册,内含ZT213规格参数说明,选型参考表以及应用原理图。更多USB相关应用及方案可查看作者文章了解....
斑马zt410中文库
霍尼维尔 ZT930 点火变压器PDF,霍尼维尔 ZT930 点火变压器
斑马ZT510打印机驱动文件
ZT2835W0M1贴片发光二极管规格书pdf,ZT2835W0M1贴片发光二极管规格书
证通598金属键盘开发SDK,适合于嵌入式开发,包括接口说明,用例代码. 调用比较复杂,需要花精力研究,不懂的开发者不要下载。