Api接口通用安全策略及实现-OSS.Core

  这篇文章一直说写,迟迟没有动手,这两天看到一些应用接口数据被别人爬虫、短信接口被人高频率请求攻击等案列,感觉简单概述分享一下接口安全验证还是有必要的。毕竟当下基本都以客户端应用为主,如果前期疏忽,发布之后的维护升级等将会有很大的麻烦。这里我将主要围绕以下几个方面:

1. 基础的安全策略

2. Restful安全实现方式介绍

3. OSS.Core实现案例

4. OSS.Core接口参数规范

一. 基础的安全策略

    这里讨论只针对应用本身,像Https或者防火墙等第三方支持不在此讨论范围。

对于一个接口项目来说,安全策略我个人认为主要分两块:1. 接口验证模块  2. 用户验证模块

  1. 接口验证模块

  这个模块是对整个接口安全层面负责。对于接口安全而言,特别是客户端接口,是直接暴露在整个互联网中的,我们首先要保证的就是不会被别人冒名请求我们的接口数据。经常使用的就是签名验证,在接口正常的数据传输之外,传递额外的约定加密签名信息等,来过滤非授权的接口请求。

  这里可以举一个去年我遇到的典型案列,当时有个外卖的站点短信发送接口没有添加任何验证,接口地址还写在了页面上,可想而知后果有多么严重,网络上的很多短信轰炸机用的就是这些接口,这里给一张当时发现时测试的截图:

  当然签名校验只是最基础的安全校验,如果再配合IP限流等校验措施效果更佳!

  2. 用户授权验证模块

  这个模块主要是对用户个体负责,上一步主要是在一定程度上过滤一些非自身应用接口请求。但是应用本身出了问题,例如漏洞或者被反编译等,又或者是人员流动造成的秘钥泄露,又如何保证接口的真实用户数据不被轻易篡改。

  对于这个问题,我们可以独立一个用户验证模块,核心思路就是通过给每个登录用户颁发token(可以通过用户编号加密,或者编号+时间戳),对用户相关的操作通过token验证,用户主键信息不通过接口明文传送,在服务端通过token解密获取。token的加解密过程都在服务端完成,和签名验证模块独立。

    这两个模块也可以通过下边的简单时序图了解相关分工:

二. Restful接口下安全实现方式介绍

 上边介绍了一个基础的接口验证步骤,这边我以常见的http接口协议来简单介绍下实现过程:

  1. 签名验证

     这个主要是通过对每次请求通过参数和随机数的排序组合生成唯一的签名【sign】信息,方式多种多样,这里我介绍一种通用做法,如果你对第三方网站签名验证比较熟悉可以跳过。

     这里因为一个接口项目可能会给对个应用提供数据服务,我们给每个应用颁发对应的appid和appsecret信息。

第一步,在正常传递的参数外,添加appid,timespan(当前时间戳)参数,把当前参数集合中值不为空的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串str,同时需要注意一下几点。

    1. 参数名ASCII码从小到大排序(字典序)
    2. 参数的值为空不参与签名
    3. 参数名区分大小写

   第二步,将得到str使用签名算法,生成sign(主要看和服务器约定的加密算法,一般使用单向签名算法即可),一下是两种常见加密算法

      1. 使用MD5

           在str后追加  &appsecret=xxx 后再进行md5 加密,即 sign = md5(str&appsecret=xxx)

      2.  使用SHA1

          因为sha1本身支持加盐操作, 直接使用  appsecret加密 str ,即 sign=sha1(str, appsecret)

    第三步:  传递内容   str&sign=xxxx   到服务端。

    以上是一个基本的签名实现过程,当然具体的实现可以根据实际情况各自调整,比如签名信息也可以放在请求header中,参数格式也可以是json等,重要的是需要保证:每次请求签名不会相同

  2.  用户授权验证实现

    这个大家可以参考最近比较流行的 jwt 协议等实现,主要思路是用户授权后,服务端颁发token返回给客户端,在请求相关授权接口时附带token即可。

    这里加密算法需要使用双向加密算法,然后服务端在处理请求时,拦截并解密相关信息,保存在上下文中。

三. OSS.Core实现案例

1. 签名验证:

  在OSS.Core项目,我把签名相关验证信息放置在请求头(httpheader)中,通过自定义AuthorizeSignMiddleware中间件在程序入口处进行拦截,主要包含以下参数(实现代码详见GitHub):

  如果你想了解详细排序加密等处理,可参见OSS.Common中的SysAuthorizeInfo

  2. 用户验证模块:

  主要通过自定义Attribute注册实现,代码详见 GitHub中AuthorizeMemberAttribute,  同时我会将当前用户信息保存在一个 AsyncLocal 变量中,详细代码参见OSS.Common中的MemberShiper

四.  OSS.Core接口参数规范

  所有的接口信息中,我会定义套全局错误码,所有的接口返回信息中都会包含ret标识,来返回当前接口的正常与否,比如:如果ret=1423时表示非法应用来源,ret=1425需要去获取授权验证token,当然每个接口也可以自定义其特有的局部错误码。 

  全局错误码详见:Github 下 ResultTypes

  同时,接口请求头中AppSource,AppVersion,AppClient 参数必填,来保证后续的活跃度,用户注册,订单分布等情况统计。

时间: 2024-08-08 22:40:21

Api接口通用安全策略及实现-OSS.Core的相关文章

各开放平台API接口通用 SDK 前言

最近两年一直在做API接口相关的工作,在平时工作中以及网上看到很多刚接触API接口调用的新人一开始会感到很不适应,包括自己刚开始做API接口调用的相关工作时,也是比较抓狂的,所有写一序列文章把之前的工作做个总结,二来写一个通用SDK把之前涉及到的代码封装成类库,以便以后可以更好地使用.三来对一些有需要的朋友,比如刚接触API接口调用的朋友来说,希望可以给他们提供一些帮助,一起交流,共同成长,一起进步. 今天这篇文章主要是谈一下自己的构想,SDK产品的构思,也希望园内的朋友提出自己宝贵的意见,如果

各开放平台API接口通用SDK序列文章 前言

最近两年一直在做API接口相关的工作,在平时工作中以及网上看到很多刚接触API接口调用的新人一开始会感到很不适应,要看的文档一大堆,自己要调用的接口找不着,或都找着了不知道怎么去调用,记得包括自己刚开始做API接口调用的相关工作时,也是比较抓狂的,也是硬着头皮去看各种文档,熟悉代码,在网上不断地去查找资料.所以决定写一序列文章把之前做的API接口相关的工作做个总结,二来写一个通用SDK把之前涉及到的代码封装成类库,以便以后可以更好地使用.就不用再重创轮子了,三来对一些有需要的朋友,比如刚接触AP

常用快递单号物流查询API接口通用对接指南(JAVA快递鸟对接)

快递查询接口通用API是给发货电商用来实现查询快递物流轨迹功能的,接口对接前要先到快递鸟网站申请接口秘钥和APIKEY 快递API的应用场景与用途 最常见的应用场景如下: (1)电商网站:例如B2C.团购.B2B.批发分销站.C2C.本地生活交易等网站. (2)管理系统:订单处理平台.订货平台.发货平台.分销系统.渠道管理系统.客户管理系统.ERP等. 快递API的用途如下: (1)让顾客登录网站后,直接在“我的订单”页面内就能看到订单的物流状态. (2)自动筛选出“已签收”.“疑难件”等状态的

.NET Core使用swagger进行API接口文档管理

一.问题背景 随着技术的发展,现在的开发模式已经更多的转向了前后端分离的模式,在前后端开发的过程中,联系的方式也变成了API接口,但是目前项目中对于API的管理很多时候还是通过手工编写文档,每次的需求变更只要涉及到接口的变更,文档都需要进行额外的维护,如果有哪个小伙伴忘记维护,很多时候就会造成一连续的问题,那如何可以更方便的解决API的沟通问题?Swagger给我们提供了一个方式,由于目前主要我是投入在.NET Core项目的开发中,所以以.NET Core作为示例 二.什么是Swagger S

ASP.NET Core 实战:构建带有版本控制的 API 接口

 一.前言 在上一篇的文章中,主要是搭建了我们的开发环境,同时创建了我们的项目模板框架.在整个前后端分离的项目中,后端的 API 接口至关重要,它是前端与后端之间进行沟通的媒介,如何构建一个 “好用” 的 API 接口,是需要我们后端人员好好思考的. 在系统迭代的整个过程中,不可避免的会添加新的资源,或是修改现有的资源,后端接口作为暴露给外界的服务,变动的越小,对服务的使用方造成的印象就越小,因此,如何对我们的 API 接口进行合适的版本控制,我们势必需要首先考虑. 系列目录地址:ASP.NET

ASP.NET Core 3.0 实战:构建多版本 API 接口

第一次在博客写分享,请多多捧场,如有歧义请多多包含! 因为业务需求发展需要,所以API接口的变更升级是必不可少的事情,而原有的接口是不可能马上停止使用的.例如:Login接口为例,1.0版本之返回用户的基本信息,而2.0版本的迭代下,要把用户祖宗十八代信息都要返回到客户端,这时候1.0 vs 2.0版本的返回信息有一点信息上的差异,如果在不进行版本控制的情况下,在原1.0的版本下优化,那么会出现一个比较严重的问题,如果还有在使用原1.0版本的终端岂不是GG了,所以如何能鱼与熊掌兼得,同时为1.0

构建微服务-使用OAuth 2.0保护API接口

微服务操作模型 基于Spring Cloud和Netflix OSS 构建微服务-Part 1 基于Spring Cloud和Netflix OSS构建微服务,Part 2 在本文中,我们将使用OAuth 2.0,创建一个的安全API,可供外部访问Part 1和Part 2完成的微服务. 关于OAuth 2.0的更多信息,可以访问介绍文档:Parecki - OAuth 2 Simplified 和 Jenkov - OAuth 2.0 Tutorial ,或者规范文档 IETF RFC 674

微信小程序的Web API接口设计及常见接口实现

微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们设计和编写Web API平台是非常重要的,通过这个我们可以实现数据的集中控制和管理,本篇随笔介绍基于Asp.NET MVC的Web API接口层的设计和常见接口代码的展示,以便展示我们常规Web API接口层的接口代码设计.参数的处理等内容. 1.Web API整体性的架构设计 我们整体性的架构设计

php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restful api 请明白一点,这个只是设计指导思想,也就是设计风格 ,比如你需要遵循这些原则 原则条件REST 指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful.Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的.从客户端到服务