开放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&timestamp=201603261407&参数1=value1&参数2=value2.......

如上,我们通过timestamp时间戳用来验证请求是否过期。这样就算被人拿走完整的请求链接也是无效的。

Sign签名安全性分析:

通过上面的案例,我们可以看出,安全的关键在于参与签名的secret,整个过程中secret是不参与通信的,所以只要保证secret不泄露,请求就不会被伪造。

总结

上述的Sign签名的方式能够在一定程度上防止信息被篡改和伪造,保障通信的安全,这里使用的是MD5进行加密,当然实际使用中大家可以根据实际需求进行自定义签名算法,比如:RSA,SHA等。

From: http://www.cnblogs.com/codelir/p/5327462.html

时间: 2024-10-24 12:10:36

开放api接口签名验证的相关文章

【转】开放api接口签名验证

不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如: 1. 请求来源(身份)是否合法? 2. 请求参数被篡改? 3. 请求的唯一性(不可复制) 为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证. 案列分析 我们通过给某 [移动端(app)] 写 [后台接口(api)] 的案例进行分析: 客户端:

springcloud提供开放api接口签名验证

一.MD5参数签名的方式 我们对api查询产品接口进行优化: 1.给app分配对应的key.secret 2.Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下: a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvaluekeyvalue...keyvalue  字符串如:将arong=1,mrong=2,crong=3 排序为:arong=1, crong=3,mrong=2  然后将参数名和参数值进行拼接得到参数字符串:arong1crong3mrong

常用API接口签名验证参考

项目中常用的API接口签名验证方法: 1. 给app分配对应的key.secret2. Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下: a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvaluekeyvalue...keyvalue  字符串如:将arong=1,mrong=2,crong=3 排序为:arong=1, crong=3,mrong=2  然后将参数名和参数值进行拼接得到参数字符串:arong1crong3mrong2: b. 将secr

Android测试工具ThreadingTest开放API接口说明

ThreadingTest(简称TT)第一期是一款Android白盒测试工具,使用离线检测的方式,在保护用户源代码的基础上,运用插装.第五代覆盖率等技术,为开发工程师与测试工程师提供一套高效可量化.可视化的交流工具.对比其它测试工具,TT在自动化测试时,会对应测试用例自动生成测试用例和代码之间的关系以及函数覆盖率,并且以TT自带的双向追溯图进行展示,在整个自动化测试进行过程中,TT还会以示波器界面可视化的监控整个自动化测试中每时每刻获取的测试数据. 基于其它测试工具测试时,TT还开放了API接口

开放API接口 笑话、天气、新闻

笑话接口示例: http://api.1-blog.com/biz/bizserver/xiaohua/list.do?maxXhid=1000000&size=1&minXhid=6 开放API接口 笑话.天气.新闻 博客分类: 其它 API新闻笑话天气开放API 闲来无事,弄了几个API接口,分享给同样需(闲的)要(没事儿)的人吧 API接口都是HTTP形式的,数据都是json格式,支持ajax调用(已开放所有域名访问) PS:演示网站http://1-blog.com 使用的人麻烦加

转载-常用API接口签名验证参考

原文地址: http://www.cnblogs.com/hnsongbiao/p/5478645.html 写的很好,就做个笔记了.感谢作者! 项目中常用的API接口签名验证方法: 1. 给app分配对应的key.secret2. Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下: a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvaluekeyvalue...keyvalue  字符串如:将arong=1,mrong=2,crong=3 排序为:aro

开放API接口及其安全性

开放出来给别人调用的API接口是就是开放API接口. 弱点: 数据窃取 用户的密码等信息被不轨之人窃取,登录账号发布敏感信息,盗刷等. 数据篡改 提交的数据被抓包后进行篡改再提交. 数据泄露 爬虫将业务数据甚至核心数据抓取,直接或者间接造成损失. RSA/DES加密 MD5混淆 TOKEN令牌 有令牌才能通过,没有令牌则不能通过 加密分为对称加密和非对称加密 对称加密有:DES,AES 加密和解密是使用同一套秘钥 非对称加密有:RSA 公钥和私钥 公钥加密,私钥解密 RSA可以用来加密和签名 H

几个开放API接口 笑话、天气、新闻

闲来无事,弄了几个API接口,分享给同样需(闲的)要(没事儿)的人吧API接口都是HTTP形式的,数据都是json格式,支持ajax调用(已开放所有域名访问) 笑话API 说明:调用后返回笑话列表,可以在参数中设置已经获取的最大笑话ID和最小笑话ID,返回结果会返回新的笑话(目前大概1w条左右,持续增加中)使用方式请求地址:http://114.215.158.105:8080/bizserver/xiaohua/list.do示例 http://114.215.158.105:8080/htm

远程开户系统开放API接口

如今随着智能识别技术的成熟和商用,金融领域也开始逐渐试水"远程开户".从OCR身份证识别到人脸识别,到如今市场上即将出现完整的远程开户系统,除了需要成熟的技术做支撑外,还需要对市场有着前瞻性的眼光. 这套远程开户系统包含了OCR身份证识别技术.银行卡识别技术.人脸识别等智能识别技术.即利用身份证识别快速采集验证用户身份,并通过联网核查进行验证身份信息,用来核实用户的真实身份;然后利用银行卡识别一键绑定银行卡,再辅以视频人脸识别进行身份进一步验证,确保开户者与证件持有者为同一人,做到人证