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固定位加密,保证参数不会被修改,调用有效;

 

相关文章
|
1月前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
100 1
|
1天前
|
人工智能 安全 API
API应用安全风险倍增,F5助企业赢得关键安全挑战
API应用安全风险倍增,F5助企业赢得关键安全挑战
19 11
|
22天前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
14天前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
43 11
|
15天前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
38 11
|
23天前
|
安全 API 数据处理
后端开发中的API设计哲学:简洁、高效与安全
【8月更文挑战第29天】 在后端开发的广阔天地中,API(应用程序编程接口)的设计如同编织一张无形的网,连接着数据的海洋与应用的大陆。本文将深入探讨如何打造一个既简洁又高效的API,同时不忘筑牢安全的防线。我们将从API设计的基本原则出发,逐步剖析如何通过合理的结构设计、有效的数据处理和严格的安全措施来提升API的性能和用户体验。无论你是初学者还是资深开发者,这篇文章都将为你提供宝贵的视角和实用的技巧,帮助你构建出更优秀的后端服务。
|
1月前
|
SQL 存储 数据处理
|
1月前
|
XML JSON API
RESTful API设计最佳实践:构建高效、可扩展的接口
【8月更文挑战第17天】RESTful API设计是一个涉及多方面因素的复杂过程。通过遵循上述最佳实践,开发者可以构建出更加高效、可扩展、易于维护的API。然而,值得注意的是,最佳实践并非一成不变,随着技术的发展和业务需求的变化,可能需要不断调整和优化API设计。因此,保持对新技术和最佳实践的关注,是成为一名优秀API设计师的关键。
|
1月前
|
监控 API 数据安全/隐私保护
​邮件API触发式接口分析?邮件API接口好评榜
邮件API在企业通信和营销中至关重要,通过自动化邮件发送流程提升效率与客户满意度。本文解析邮件API触发式接口,即基于特定事件(如用户注册、购买产品)自动发送邮件的技术,能显著加快企业响应速度并增强用户体验。推荐市场上的优秀邮件API产品,包括SendGrid、Mailgun、Amazon SES、Postmark及新兴的AOKSend,它们各具特色,如高发送率、详细分析工具、灵活配置、强大的日志功能及用户友好的API接口,帮助企业根据不同需求选择最合适的邮件API解决方案。
|
18天前
|
测试技术 API 数据库
电商API接口定制与开发系列之——商品详情接口介绍
——在成长的路上,我们都是同行者。这篇关于API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 在电商API接口定制与开发系列中,商品详情接口是至关重要的一部分,它直接关系到用户浏览商品、获取商品信息的关键环节。以下是对商品详情接口的详细介绍: