开放api接口签名验证,添加sign,时间戳

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

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

Sign签名安全性分析:

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

总结

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

(0)

相关推荐

  • 如何用 Python 识别车牌?

    来源:Python 技术「ID: pythonall」 车牌识别在高速公路中有着广泛的应用,比如我们常见的电子收费(ETC)系统和交通违章车辆的检测,除此之外像小区或地下车库门禁也会用到,基本上凡是需 ...

  • API接口安全设计方案(已实现)

    API接口安全设计方案(已实现)

  • NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因

    认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...

  • 产品规划思考点滴总结

    今天对围绕SOA,云原生,DevOps等相关产品规划的内容做下思考总结.如果看过我前面的文章,也基本可以了解到当前我们整体是围绕云原生解决方案提供来规划和实现相应的技术产品和组件.这里面核心还是微服务 ...

  • httprunner学习24-sign签名验证

    前言 一般公司对外的接口都会用到sign签名,对不同的客户提供不同的apikey ,这样可以提高接口请求的安全性,避免被人抓包后乱请求. sign签名是一种很常见的方式 关于sign签名的可以参考前面 ...

  • 拒绝接口裸奔!开放API接口签名验证!

    接口安全问题 请求身份是否合法? 请求参数是否被篡改? 请求是否唯一? AccessKey&SecretKey (开放平台) 请求身份 为开发者分配AccessKey(开发者标识,确保唯一)和 ...

  • API接口设计之token、timestamp、sign具体实现

    一.token 简介 Token:访问令牌access token, 用于接口中, 用于标识接口调用者的身份.凭证,减少用户名和密码的传输次数.一般情况下客户端(接口调用方)需要先向服务器端申请一个接 ...

  • 国际象棋云库API接口说明

    概述 国际象棋云库(简称'云库') API 接口分为两部分,访问云库,可以直接通过基于 HTTP 的 RESTful API 实现. 此外,在原有的 UCI 引擎通讯协议上扩展了云库相关的指令,云库. ...

  • 中国象棋云库API接口说明

    中国象棋云库API接口说明 概述 中国象棋云库(简称'云库') API 接口分为两部分,访问云库,可以直接通过基于 HTTP 的 RESTful API 实现. 此外,在原有的 UCI 引擎通讯协议上 ...

  • 盘点15个好用的API接口管理神器

    分布式实验室 1周前 如今,API已在软件.Web和移动应用程序开发领域无处不在,从企业内部到面向公众的应用以及与合作伙伴进行系统集成.通过使用API,开发人员可以创建满足各种客户需求的应用程序.而软 ...

  • IOT语义互操作性之API接口

    这个系列文章描述了一个单一的语义数据模型来支持物联网和建筑.企业和消费者的数据转换. 这种模型必须简单可扩展, 以便能够在各行业领域之间实现插件化和互操作性. 对于一个目前从事智能硬件的老码农,觉得这 ...

  • 微服务架构下的API接口驱动开发,设计和集成

    今天谈下在微服务架构下,接口设计和开发方面的思考. 对于微服务架构,SOA和Http Rest API接口设计,在我前面的头条文章中均有专门的说明,因此对于基础方面的解释在本文不再重复.对于今天要写的 ...

  • 全字段多条件搜索(api接口)

    近期在做项目时遇到了一个全表全字段多条件搜索的需求,在平时搜索最常见的就是 字段+like +'% 条件%'这种模式,但遇到多条件多字段时,这种就不适用了. 表字段已知,条件未知,条件数量未知,这种情 ...

  • python接口自动化21-规范的API接口文档示例

    前言 接口文档到底长啥样?做接口测试最大的障碍在于没有接口文档,很多公司不注重接口文档的编写,导致测试小伙伴没见过接口文档. 运气好一点的测试小伙伴可能厚着脸皮找开发要过接口文档,然而拿过来的接口文档 ...