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

本文涉及的产品
对象存储 OSS,20GB 3个月
密钥管理服务KMS,1000个密钥,100个凭据,1个月
对象存储 OSS,恶意文件检测 1000次 1年
简介:

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

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













本文转自xmgdc51CTO博客,原文链接:http://blog.51cto.com/12953214/1942915 ,如需转载请自行联系原作者





相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
23天前
|
存储 安全 API
如何对 API 进行安全加密?
对API进行安全加密是保障数据安全和系统稳定的重要措施
122 56
|
10天前
|
JSON API 开发工具
淘宝实时 API 接口丨淘宝商品详情接口(Taobao.item_get)
淘宝商品详情接口(Taobao.item_get)允许开发者获取商品的详细信息,包括基本信息、描述、卖家资料、图片、属性及销售情况等。开发者需注册账号、创建应用并获取API密钥,通过构建请求获取JSON格式数据,注意遵守平台规则,合理使用接口,确保数据准确性和时效性。
|
11天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
53 5
|
11天前
|
JSON 缓存 监控
淘宝商品详情接口(Taobao.item_get)丨淘宝API接口指南
淘宝商品详情接口(Taobao.item_get)允许开发者通过HTTP GET方法获取淘宝商品的详细信息,包括商品ID、价格、库存等。请求需包含key、secret、num_iid等必选参数,支持缓存及多种返回格式。此接口广泛应用于电商数据分析、商品选品、价格监控等领域,提升商家运营效率。
|
15天前
|
JSON 搜索推荐 API
LAZADA关键词搜索API接口的获取与应用
Lazada作为东南亚领先的电商平台,为满足开发者和商户需求,开放了关键词搜索API接口。本文详细介绍该接口的获取与应用,助力提升电商业务效率。接口支持关键词搜索、指定搜索范围和排序方式,提供精准、灵活且全面的数据支持,促进电商应用和服务的优化与创新。
21 3
|
25天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
1月前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;
|
1月前
|
监控 测试技术 API
确保微服务的API版本控制策略能够适应不断变化的业务需求
确保微服务的API版本控制策略能够适应不断变化的业务需求
|
1月前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。
|
1月前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应