API接口安全设计方案

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: API接口安全设计方案

API接口安全设计方案

1、背景

主要从api安全方面考虑。

2、接口安全设计

在代码层面,对接口进行安全设计

一、使用token进行用户身份认证

二、使用sign防止传入参数被篡改

三、用时间戳防止暴力请求

一、使用token进行用户身份认证

用户身份认证的流程图如下:

 

具体说明如下:

  1. 用户登录时,客户端请求接口,传入用户名和密文的密码 后台服务对用户身份进行验证。若验证失败,则返回错误结果;若验证通过,则生成一个随机不重复的token,并将其存储在redis中,设置一个过期时间。其中,rediskeytokenvalue为验证通过后获得的用户信息
  2. 用户身份校验通过后,后台服务将生成的token返回客户端。客户端请求后续其他接口时,需要带上这个token。后台服务会统一拦截接口请求,进行token有效性校验,并从中获取用户信息,供后续业务逻辑使用

二、使用sign防止传入参数被篡改

为了防止中间人攻击(客户端发来的请求被第三方拦截篡改),引入参数的签名机制。

具体步骤如下:

 

1、客户端和服务端约定一个加密算法(或MD5摘要也可), 客户端发起请求时,将所有的非空参数按升序拼在一起,通过加密算法形成一个sign,将其放在请求头中传递给后端服务。

2、后端服务统一拦截接口请求,用接收到的非可空参数根据约定好的规则进行加密,和传入的sign值进行比较。若一致则予以放行,不一致则拒绝请求。

由于中间人不知道加密方法,也就不能伪造一个有效的sign。从而防止了中间人对请求参数的篡改。

三、用时间戳防止暴力请求

sign机制可以防止参数被篡改,但无法防dos攻击(第三方使用正确的参数,不停请求服务器,使之无法正常提供服务)。因此,还需要引入时间戳机制。

具体的操作为:客户端在形成sign值时,除了使用所有参数和token外,再加一个发起请求时的时间戳。即

sign值来源 = 所有非空参数升序排序+token+timestamp

而后端则需要根据当前时间和sign值的时间戳进行比较,差值超过一段时间则不予放行。

若要求不高,则客户端和服务端可以仅仅使用精确到秒或分钟的时间戳,据此形成sign值来校验有效性。这样可以使一秒或一分钟内的请求是有效的。

若要求较高,则还需要约定一个解密算法,使后端服务可以从sign值中解析出发起请求的时间戳。

总结后的流程图如下

 

时间戳机制:用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如30秒),则认为该请求失效。时间戳超时机制是防御重复调用和爬取数据的有效手段。

// timeStamp是客户端从Header传过来的值

Long timeStamp = RequestHeaderContext.getInstance().getTimeStamp();

boolean checkTime = checkTime(timeStamp, 30 * 1000);

if (!checkTime) {

   return responseErrorAPISecurity(response);

}

 

// checkTime方法

public static boolean checkTime(Long time, Integer variable){

   Long currentTimeMillis = System.currentTimeMillis();

   Long addTime = currentTimeMillis + variable;

   Long subTime = currentTimeMillis - variable;

   if (addTime > time && time > subTime){

       return true;

   }

   return false;

}

 

签名机制: 将请求的API参数”+“时间戳”+“进行MD5算法加密,加密后的数据就是本次请求的签名signature,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改

// 请求的API参数,如果是再body,则MD5;如果是param,则原字符串

StringBuffer urlSign = new StringBuffer();

 

if ("POST".equals(request.getMethod()) || "PUT".equals(request.getMethod())) {

   String bodyStr = RequestReaderUtil.ReadAsChars(request);

   String bodySign = "";

   if (!StringUtils.isEmpty(bodyStr)){

       bodySign = DigestUtils.md5DigestAsHex((bodyStr).getBytes());

   }

   urlSign = new StringBuffer(bodySign);

} else if ("GET".equals(request.getMethod()) || "DELETE".equals(request.getMethod())) {

   String params = request.getQueryString();

   if (params == null){

       params = "";

   }

   urlSign = new StringBuffer(params);

}

// “请求的API参数”+“时间戳”+“进行MD5算法加密

String sign = DigestUtils.md5DigestAsHex(urlSign.append(timeStamp).append(salt).toString().getBytes());

 

// signature是客户端从Header传过来的值

if (signature.equals(sign)) {

   return true;

} else {

   return false;

}

 

3、项目拟采用的方案

1)获取token

这里还是隐藏下了。

2)接口新增三个字段:tokentimestampsign

{

 "address": "33",

 "bussinessType": "22",

 "city": "111",

 "companyName": "st232ring",

 "token": "idfajdjjlkczkvhcklgjkfsj<jjkv",

 "timestamp": "20210714164139",

 "sign":"fdakfljdkfjdks"

}

3)签名sign生成规则

规则:sha1(keyvalkeyval+token+timestamp+id)

例如:sha1address33bussinessType22city111companyNamest232ringtokentimestampid

这里新增一个id值,与token对应,传输过程中不使用,只用于加密,保证数据即使被截获,因为请求中没有id的传输,更加安全。

4)几个参数上面已经说过了,简单再说一句。

token身份认证;

timestamp方式防止dos攻击,防止重放,简单说就是一次接口调用,只能用一定时间,比如比对时间,60s内该次调用有效,60秒后失效;

sign签名,通过参数+token+timestamp+id固定位加密,保证参数不会被修改,调用有效;

 

相关文章
|
8天前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
2天前
|
JSON 搜索推荐 API
京东店铺所有商品接口系列(京东 API)
本文介绍如何使用Python调用京东API获取店铺商品信息。前期需搭建Python环境,安装`requests`库并熟悉`json`库的使用。接口采用POST请求,参数包括`app_key`、`method`、`timestamp`、`v`、`sign`和业务参数`360buy_param_json`。通过示例代码展示如何生成签名并发送请求。应用场景涵盖店铺管理、竞品分析、数据统计及商品推荐系统,帮助商家优化运营和提升竞争力。
37 23
|
1天前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
20 12
|
14天前
|
JSON API 数据格式
京东商品SKU价格接口(Jd.item_get)丨京东API接口指南
京东商品SKU价格接口(Jd.item_get)是京东开放平台提供的API,用于获取商品详细信息及价格。开发者需先注册账号、申请权限并获取密钥,随后通过HTTP请求调用API,传入商品ID等参数,返回JSON格式的商品信息,包括价格、原价等。接口支持GET/POST方式,适用于Python等语言的开发环境。
66 11
|
5天前
|
Web App开发 JSON 测试技术
API测试工具集合:让接口测试更简单高效
在当今软件开发领域,接口测试工具如Postman、Apifox、Swagger等成为确保API正确性、性能和可靠性的关键。Postman全球闻名但高级功能需付费,Apifox则集成了API文档、调试、Mock与自动化测试,简化工作流并提高团队协作效率,特别适合国内用户。Swagger自动生成文档,YApi开源但功能逐渐落后,Insomnia界面简洁却缺乏团队协作支持,Paw仅限Mac系统。综合来看,Apifox是国内用户的理想选择,提供中文界面和免费高效的功能。
|
17天前
|
弹性计算 监控 安全
API稳定安全最佳实践:用阿里云SDK为业务保驾护航
阿里云智能集团高级技术专家赵建强和曹佩杰介绍了API稳定安全最佳实践,涵盖业务上云真实案例、集成开发最佳实践、配额管理和共担模型四部分。通过分析企业在不同阶段遇到的问题,如签名报错、异常处理不严谨、扩容失败等,提出了解决方案和工具,确保API调用的安全性和稳定性。特别强调了SDK的使用、无AK方案、自动刷新机制以及配额中心的作用,帮助用户构建更稳定、安全的服务,提升运维效率。最终介绍了集成开发共担模型,旨在通过最佳实践和平台工具,保障业务的稳定与安全,推动行业创新与发展。
|
25天前
|
安全 API 数据安全/隐私保护
自学记录HarmonyOS Next DRM API 13:构建安全的数字内容保护系统
在完成HarmonyOS Camera API开发后,我深入研究了数字版权管理(DRM)技术。最新DRM API 13提供了强大的工具,用于保护数字内容的安全传输和使用。通过学习该API的核心功能,如获取许可证、解密内容和管理权限,我实现了一个简单的数字视频保护系统。该系统包括初始化DRM模块、获取许可证、解密视频并播放。此外,我还配置了开发环境并实现了界面布局。未来,随着数字版权保护需求的增加,DRM技术将更加重要。如果你对这一领域感兴趣,欢迎一起探索和进步。
85 18
|
1月前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
90 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
|
25天前
|
JSON 安全 API
淘宝商品详情API接口(item get pro接口概述)
淘宝商品详情API接口旨在帮助开发者获取淘宝商品的详细信息,包括商品标题、描述、价格、库存、销量、评价等。这些信息对于电商企业而言具有极高的价值,可用于商品信息展示、市场分析、价格比较等多种应用场景。
|
5天前
|
API Python
京东拍立淘图片搜索商品接口系列(京东 API)
简介:本文介绍了如何使用拍立淘图片搜索 API 在京东平台上查找相似商品。首先需安装 Python 库 `requests`,并通过内置库 `hashlib` 生成签名。API 支持通过图片 URL 或 Base64 编码的图片进行搜索,返回商品名称、价格等信息。示例代码展示了如何构建请求并处理响应。应用场景包括电商购物助手和竞品分析,帮助用户和商家提高购物效率和市场竞争力。

热门文章

最新文章