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

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 参数必填,来保证后续的活跃度,用户注册,订单分布等情况统计。

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

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

    最近两年一直在做API接口相关的工作,在平时工作中以及网上看到很多刚接触API接口调用的新人一开始会感到很不适应,包括自己刚开始做API接口调用的相关工作时,也是比较抓狂的,所有写一序列文章把之前的工 ...

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

    最近两年一直在做API接口相关的工作,在平时工作中以及网上看到很多刚接触API接口调用的新人一开始会感到很不适应,要看的文档一大堆,自己要调用的接口找不着,或都找着了不知道怎么去调用,记得包括自己刚开 ...

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

    一.问题背景 随着技术的发展,现在的开发模式已经更多的转向了前后端分离的模式,在前后端开发的过程中,联系的方式也变成了API接口,但是目前项目中对于API的管理很多时候还是通过手工编写文档,每次的需求 ...

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

    一.前言 在上一篇的文章中,主要是搭建了我们的开发环境,同时创建了我们的项目模板框架.在整个前后端分离的项目中,后端的 API 接口至关重要,它是前端与后端之间进行沟通的媒介,如何构建一个 “好用” ...

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

    第一次在博客写分享,请多多捧场,如有歧义请多多包含! 因为业务需求发展需要,所以API接口的变更升级是必不可少的事情,而原有的接口是不可能马上停止使用的.例如:Login接口为例,1.0版本之返回用户 ...

  6. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  7. 开放平台API接口安全策略汇总

    在设计开放平台接口过程中,往往会涉及接口传输安全性相关的问题,本文对接口加密及签名的相关知识做了一个总结,在方便自己查阅的同时也分享给大家做一些参考. 接口安全性问题思考 接口安全性问题主要来源于几方 ...

  8. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  9. IdentityServer4实现.Net Core API接口权限认证(快速入门)

    什么是IdentityServer4 官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. 通俗 ...

随机推荐

  1. POJ 1007

    DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 83069 Accepted: 33428 Descrip ...

  2. 使用CSS和JQuery实现表格单元格内容超出时部分隐藏,隐藏部分以...显示

    1.使用CSS实现,给此单元格添加一个Class: width:130px; display:block; overflow:hidden; word-break:keep-all; white-sp ...

  3. [笔记]A*寻路算法初探

    写在开始之前 最近突然对各路游戏的寻路算法很感兴趣,于是去学习了下游戏里的AI们是如何寻路的.网上相关内容很多,但同时有些说法也不一,制作自己的A* 算法时也有因不同的说法而困惑.整理多方资料并自己实 ...

  4. 通过分析 JDK 源代码研究 TreeMap 红黑树算法实

    TreeMap和TreeSet是Java Collection Framework的两个重要成员,其中TreeMap是Map接口的常用实现类,而TreeSet是Set接口的常用实现类.虽然HashMa ...

  5. docker对cpu使用及在kubernetes中的应用

    docker对CPU的使用 docker对于CPU的可配置的主要几个参数如下: --cpu-shares CPU shares (relative weight) --cpu-period Limit ...

  6. React入门---开始前的准备(上)-2

    开始前准备: 1.安装配置nodeJs(nodeJS官网) 检查安装成功: node -v npm -v 2.使用NPM配置React开发环境 (1). 创建项目文件夹(创建文件夹时,文件夹名不要起为 ...

  7. GO的初始简书(二)环境变量设置与说明

    安装GO后你应该做的一些事~ 将自己需要开发的项目加入环境变量中的gopath中 GOPATH其实就一个工作目录   -----正在开发的项目 1首先在本地新建目录 go_work 2 vi ~/.b ...

  8. 在JLabel上显示图片,并且图片自适应JLabel的大小

    本文转载地址:       http://blog.csdn.net/xiaoliangmeiny/article/details/7060250 在写<Core Java>上的示例代码时 ...

  9. 读书笔记系列01-《收获、不止Oracle》

    读书笔记系列01-<收获.不止Oracle> 最近计划将看过的Oracle书籍依次系统的总结下读书笔记. 这本书是我个人觉得写的最有趣的Oracle书籍,也是我接触Oracle后第一本完全 ...

  10. 强制解包看 Swift 的设计

    不知道大家有没有发现,在一个 Objective-C 和 Swift 混编的 App 中,当把一个 OC 中的参数转到 Swift 时,Swift 会自动把这个变量进行强制解包.举个例子,我在 OC ...