【转】开放api接口签名验证
不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如:
- 1. 请求来源(身份)是否合法?
- 2. 请求参数被篡改?
- 3. 请求的唯一性(不可复制)
为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证。
案列分析
我们通过给某 [移动端(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等。
相关方法源码分享:
源码已托管至码云:https://git.oschina.net/daimali/Daimali.ISV
来源:http://www.daimali.com/index.php/2016/04/27/241/
学习交流群:364976091
【转】开放api接口签名验证相关推荐
- 拒绝接口裸奔!开放API接口签名验证!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/kChH 接口安全问题 请求身份是否合 ...
- 开放API接口签名验证,让你的接口从此不再裸奔
点击上方蓝色"终端研发部",选择"设为星标" 学最好的别人,做最好的我们 接口安全问题 请求身份是否合法? 请求参数是否被篡改? 请求是否唯一? AccessK ...
- 开放api接口签名验证
不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候, ...
- 公司接口裸奔10年了,有必要用API接口签名验证吗?
点击上方"阿拉奇学Java",选择"置顶或者星标" 每天早晨00点00分,与你相约! 往日回顾:微信支付的架构到底有多牛? 接口安全问题 请求身份是否合法? 请 ...
- 腾讯会议开放API接口,为企业打造专属的“腾讯会议”
远程办公需求在疫情期间爆发,推动各行各业加速企业内外部协同效率的数字化改造.基于这样的背景,腾讯会议宣布开放API接口,无论是企业IT.系统集成商.SaaS服务商,均可轻松适配多种会议场景需求,同时还 ...
- 开放API接口整合多元办公能力,企业微信助IT企业打造高效办公平台
5月11日,企业微信线下行业交流沙龙--IT行业专场来到北京,产品团队在现场深入解读了企业微信如何更好地帮助IT企业兼顾效率与成本,满足IT企业办公的高效.轻便和移动化. 此次活动,艺龙网及众安保险作 ...
- 天行数据的开放API接口
天行数据的开放API接口: 接口名称 链接 简介 微信链接转换 https://www.tianapi.com/apiview/89 将临时链接转为永久链接 查询微信全文 https://www.ti ...
- 开放 API 接口安全设计思路
开放API接口安全校验的背景: 在未进行安全处理的开放 API 接口存在诸多的风险问题,如以下三种常见场景: 1.场景一 A 公司开发的开放 API 未对接口进行安全控制,有黑客通过爬虫程序调用开放 ...
- 银行开放api接口_开放标准API如何彻底改变银行业
银行开放api接口 英国政府已委托英国银行进行可行性研究,以使客户能够通过开放标准API与第三方共享交易数据. 早在12月的秋季声明中首次提到,总理现在就在3月的最新预算中概述了强制性开放银行API标 ...
最新文章
- 建立ghost备份后,找不到gho文件
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...
- python全栈开发总结_python全栈开发 * 12 知识点汇总 * 180530
- 工信部副部长刘利华:推动5G全球统一标准 加强国际合作
- request的生命周期
- wxWidgets:wxCollapsiblePane类用法
- 安卓 原生okhttp使用get与post获取网络数据
- dropbox_在5分钟内学习Dropbox API
- 为什么说“进程是资源分配的单位、线程是调度的单位”?
- 蓝盾小火墙补丁_网络安全知识小科普
- Python压缩新文件到已有ZIP文件
- Android eclipse sdk包升级
- 中新赛克数据可视化_大道至简,OceanEye大数据可视化工具的高效之道
- 当中国传统文化IP与NFT撞个满怀,能擦出什么火花
- 计算机处理器(CPU)基础
- 【毕业设计】30-基于单片机矿井瓦斯_气体浓度_烟雾浓度报警设计(原理图+源代码+仿真+答辩论文+答辩PPT)
- 【目录】全志V3S学习记录
- Spring boot快速开发Rest服务
- 打小都说我聪明,自从学了Linux,我才如梦初醒
- 移动常见业务单词和词组
热门文章
- debian,ubuntu下安装MariaDB,并设置密码,修改端口,允许外网访问
- python精度丢失_JS大坑之19位数的Number型精度丢失问题详解_稚终_前端开发者
- python获取图片像素矩阵_用python处理图片实现图像中的像素访问
- JAVA批量上传下载Excel_如何实现批量上传----------Java解析excel
- Centos7 上安装 mysql5.7
- dataset的去重计数 g2_去互联网公司面试,面试官问我SpringCloud,附答案
- 性能压测服务器502报错,一种交易系统的性能测试方法及相关服务器
- JAVA 反射知识点总汇
- python数据库pymysql_Python——数据库04 Python操作MySQL pymysql模块使用,python,04python,MySQLpymysql...
- latex 表格单元格上下左右居中_Excel文字对齐技巧:学会这6种方式,快速整理规范表格...