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

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. 浏览器存储(cookie、localStorage、sessionStorage)

    互联网早期浏览器是没有状态维护,这个就导致一个问题就是服务器不知道浏览器的状态,无法判断是否是同一个浏览器.这样用户登录.购物车功能都无法实现,Lou Montulli在1994年引入到web中最终纳 ...

  2. hdu2159 FATE 经典二维背包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 思路: 定义ans存当前满足条件的消耗的最小的忍耐值(满足条件的忍耐值为在当前消耗的忍耐值的情况 ...

  3. MFC教程

    MFC教程 还有VS2015的视频教程 试看教程地址:http://dwz.cn/4PcfPk免费下载地址:http://dwz.cn/mfc888 一.VS2010/MFC编程入门教程之目录 第一部 ...

  4. ZED 相机 && ORB-SLAM2安装环境配置与ROS下的调试

    注:1. 对某些地方进行了更新(红色标注),以方便进行配置. 2. ZED ROS Wrapper官方github已经更新,根据描述新的Wrapper可能已经不适用与Ros Indigo了,如果大家想 ...

  5. springcloud(二):注册中心Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...

  6. php 使用composer

    之前写过相关的composer,之后碰到了几个朋友问我,我整理了一下,方便自己也方便大家日后查阅~~不玩开源的程序员不是好厨子     1.执行在线安装         curl -sS https: ...

  7. Java图书管理系统(用Java常用集合实现)

    图书管理系统 一.需求说明 1.功能:登录,注册,忘记密码,管理员管理,图书管理. 2.管理员管理:管理员的增删改查. 3.图书管理:图书的增删改查. 4.管理员属性包括:id,姓名,性别,年龄,家庭 ...

  8. Hibernate SQLQuery 原生SQL 查询及返回结果集处理-2

    1. 返回List, .setResultTransformer(      Transformers.ALIAS_TO_ENTITY_MAP);将结果转为Map,存放到list中,即list中为若干 ...

  9. java虚拟机学习-深入理解JVM(1)

    1   Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言.Java类文件格式.Java虚拟机和Java应 ...

  10. jQuery对象的创建(一)

    在jQuery的常规用法中,执行"$()"返回的是一个jQuery对象,在源码中,它是这样定义的: ... var jQuery = function() { return new ...