开放式API安全防护的七大原则

简介: 在我们日常工作程序开发过程中,难免会涉及与第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(即防窃取)?

在我们日常工作程序开发过程中,难免会涉及与第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(即防窃取)?API 是模块或者子系统之间交互的接口定义,优秀的系统架构离不开好良好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。下面我们就来讨论下常用的一些API设计的安全方法。微信图片_20220608104816.jpg


一、API服务为什么要签名?


首先要明确,接口服务需要解决的三个问题:


  • 请求是否合法:是否是我的信任方


  • 请求是否被篡改:是否被第三方劫持并篡改参数


  • 防止重复请求(防重放):是否重复请求


二、服务调用流程


1. 接口调用方(客户端)向接口提供方(服务器)申请接口调用账号,申请成功后,接口提供方会给接口调用方一个appId和一个key参数;


2. 客户端携带参数appId、timestamp、sign去调用服务器端的API token,其中sign=加密(appId + timestamp + key);


3. 客户端拿着api_token 去访问不需要登录就能访问的接口;


4. 当访问用户需要登录的接口时,客户端跳转到登录页面,通过用户名和密码调用登录接口,登录接口会返回一个usertoken, 客户端拿着usertoken 去访问需要登录才能访问的接口;


5. sign的作用是防止参数被篡改,客户端调用服务端时需要传递sign参数,服务器响应客户端时也可以返回一个sign用于客户端校验返回的值是否被非法篡改了。客户端传的sign和服务器端响应的sign算法可能会不同。


三、必要参数介绍


一般 token、timestamp 和 sign 三个参数会在接口中会同时作为参数传递,每个参数都有各自的用途。3.1 tokenToken:访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证,减少用户名和密码的传输次数。一般情况下客户端(接口调用方)需要先向服务器端申请一个接口调用的账号,服务器会给出一个appId和一个key, key用于参数签名使用,注意key保存到客户端,需要做一些安全处理,防止泄露。Token的值一般是UUID,服务端生成Token后需要将token作为key,将一些和token关联的信息作为value保存到缓存服务器中(redis),当一个请求过来后,服务器就去缓存服务器中查询这个Token是否存在,存在则调用接口,不存在返回接口错误,一般通过拦截器或者过滤器来实现,Token分为两种:


  • API Token(接口令牌): 用于访问不需要用户登录的接口,如登录、注册、一些基本数据的获取等。获取接口令牌需要拿appId、timestamp和sign来换,sign=加密(timestamp+key);


  • USER Token(用户令牌): 用于访问需要用户登录之后的接口,如:获取我的基本信息、保存、修改、删除等操作。获取用户令牌需要拿用户名和密码来换。


关于Token的时效性: token可以是一次性的、也可以在一段时间范围内是有效的,具体使用哪种看业务需要。

3.2 timestamptimestamp:


时间戳,是客户端调用接口时对应的当前时间戳,时间戳用于防止DoS攻击。当黑客劫持了请求的url去DoS攻击,每次调用接口时接口都会判断服务器当前系统时间和接口中传递的timestamp的差值,如果这个差值超过某个设置的时间(假如5分钟),那么这个请求将被拦截掉,如果在设置的超时时间范围内,是不能阻止DoS攻击的。timestamp机制只能减轻DoS攻击的时间,缩短攻击时间。DoSDoS是Denial of Service的简称,即拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务。最常见的DoS攻击有计算机网络带宽攻击和连通性攻击。DoS攻击是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段残忍地耗尽被攻击对象的资源,目的是让目标计算机或网络无法提供正常的服务或资源访问,使目标系统服务系统停止响应甚至崩溃,而在此攻击中并不包括侵入目标服务器或目标网络设备。这些服务资源包括网络带宽,文件系统空间容量,开放的进程或者允许的连接。这种攻击会导致资源的匮乏,无论计算机的处理速度多快、内存容量多大、网络带宽的速度多快都无法避免这种攻击带来的后果。


3.3 signnonce


随机值,是客户端随机生成的值,作为参数传递过来,随机值的目的是增加sign签名的多变性。随机值一般是数字和字母的组合,6位长度,随机值的组成和长度没有固定规则。sign: 一般用于参数签名,防止参数被非法篡改,最常见的是修改金额等重要敏感参数, sign的值一般是将所有非空参数按照升序排序然后将如下数据:


token+key+timestamp+nonce(随机数)


拼接在一起,然后使用某种加密算法进行加密,作为接口中的一个参数sign来传递,也可以将sign放到请求头中。接口在网络传输过程中如果被黑客挟持,并修改其中的参数值,然后再继续调用接口,虽然参数的值被修改了,但是因为黑客不知道sign是如何计算出来的,不知道sign都有哪些值构成,不知道以怎样的顺序拼接在一起的,最重要的是不知道签名字符串中的key是什么,所以黑客可以篡改参数的值,但没法修改sign的值,当服务器调用接口前会按照sign的规则重新计算出sign的值然后和接口传递的sign参数的值做比较,如果相等表示参数值没有被篡改,如果不等,表示参数被非法篡改了,就不执行接口了。


微信图片_20220608104819.jpg


四、API安全应用原则


4.1 使用 HTTPS


现在的 Web 已经不是之前那个年代,标准的 HTTP 满足不了 Web 安全需求。而各大浏览器供应商开始标记不使用安全层的 URL,你的 API 也可以考虑开始动手做这件事——用 HTTPS。HTTPS 采用传输层安全性协议(TLS)对传输进行加密。这意味着 HTTPS 对客户端和服务器之间的通信进行加密。对 API 而言,HTTPS 意味着从 API 发送的内容是受第三方保护的,但更重要的是这意味着访问凭证是安全的。


4.2 认证


说到访问凭证,避免意外使用 API 的最直接的方法便是确保正确的身份验证。身份验证决定了你是否可访问 API 及如何访问某个 API,即便是对外开放的免费 API 理论上也应当考虑采用身份验证策略以保证安全性。有了身份认证,你可以限制或删除滥用 API 的使用者,让使用者在需要时重新设置凭证,从而保护他们的安全。


4.3 授权


起到和身份验证类似作用的是授权。身份验证和授权的区别在于,身份验证关注的是 API 的使用者是谁,而授权关注的是他们能够访问的内容。举个例子,免费计划用户可能被授权只能访问你所有 API 的某个子集。当你想集成诸如社交登录此类 API 时,用户授权可让应用从社交平台读取他们的配置文件数据。


4.4 限流限速


提到安全,我们不得不提限流限。当然,如何处理不适当的访问对管理资源也很有用。限流限是一种限制 API 使用的技术。它不仅在经济上保护资源,但也保证了服务器不会因某次大量的请求而超载。大多数限的方法都基于时间的:一般会设置一个账单周期来处理 API 总体使用情况,也会用“突发”方法来限制大量涌入的请求。如果你看到 429 HTTP 状态代码,说明你正在被限速。


4.5 验证和净化输入


要攻击 Web 程序最古老的方式之一是输入,即:我们访问数据的方式可能已经改变,但是验证任意用户输入的需要还没有改变。客户端验证有助于防止错误和改善用户体验,但是 API 还需要在对输入执行操作前验证和净化(sanitize)输入——净化策略为删除请求中的恶意或无效代码。验证确保数据满足资源期望的必要条件,例如:类型、形式,甚至是密码结构等因素。


4.6 数据按需开放


采用快捷方式将数据模型直接映射到接口是很诱人,但这不仅会产生冗长的响应、增加带宽使用,而且还会暴露用户不需要访问的数据。举个例子:一个 /user 接口要返回用户信息。它可能只要用户的一些基本信息,而不需要用户的密码/权限。


4.7 勿暴露敏感信息


除了对 API 的输入数据进行净化(sanitize)外,还需要对从中产生的信息进行净化。错误消息对用户了解问题的发生至关重要,但要确保不泄漏任何敏感数据。向终端用户提供 API 内部代码结构的详细信息会为攻击者提供便利,所以一定要确保错误信息的配置不仅能提供足够的信息来帮助用户调试,并提供足够的信息让他们报告问题,但又不足以暴露应用程序的内部工作和敏感数据。


五、总结


随着硬件设备,分布式计算能力的不断提升,大数据处理能力的完善,也许现在还算安全的防护措施,在不久将来可就会变得不堪一击,数据安全的攻防势必是一场持久战,道高一尺魔高一丈,只有不断总结与改进,才能极大可能保护我们核心数据用户的权益。


虽然本质上 API 就是拿来用的,但即便某个 API 的使用者全是内部人员,它还是可能会出现安全问题。当然了有些平台也提供 IP 白名单服务,可以进一步防止Open API 被冒用。


为了解决 API 安全问题,在本文我们列举了一系列 API 的最佳实践,希望能够帮助到你。


微信图片_20220608104822.jpg

相关文章
|
20天前
|
机器学习/深度学习 API iOS开发
探索iOS开发中的SwiftUI框架深入理解RESTful API设计原则与最佳实践
【7月更文挑战第30天】本文深入探讨了SwiftUI框架在iOS开发中的应用,分析了其对用户界面构建的简化方法及性能优化。通过比较传统UI构建方式与SwiftUI的差异,揭示了SwiftUI如何提高开发效率和用户体验。文章还讨论了SwiftUI在实际项目中的集成策略,并展望了其未来的发展方向。 【7月更文挑战第30天】在数字时代的浪潮中,RESTful API如同一座桥梁,连接着不同的软件系统。本文将探讨RESTful API的核心设计原则,揭示其背后的哲学思想,并通过实例分析展示如何将这些原则应用于实际开发中。我们将从资源定位、接口一致性到HTTP方法的恰当使用,逐一剖析,旨在为开发者提供
38 1
|
26天前
|
缓存 安全 API
后端开发中的API设计原则与实践
在数字化时代的浪潮中,后端开发作为技术架构的核心,承载着数据交互与业务逻辑的重要职责。本文深入探讨了API设计的艺术与科学,从RESTful原则到安全性考量,再到性能优化的实践策略,旨在为后端开发者提供一套全面的API设计指南。通过具体案例分析,文章揭示了良好API设计对于提升系统可维护性、扩展性和用户体验的重要性,同时指出了常见设计陷阱与应对策略,为后端开发领域的专业人士提供了宝贵的参考和启示。
37 0
|
7天前
|
存储 API 数据库
后端开发中的API设计原则
【8月更文挑战第12天】在数字化时代,后端开发是构建软件系统的基石。其中,API(应用程序编程接口)的设计至关重要,它直接影响到系统的性能、可维护性以及用户体验。本文将深入探讨后端API设计的几项核心原则,帮助开发者构建更加高效和稳定的后端服务。
|
12天前
|
SQL 安全 前端开发
后端开发中的API设计原则
【8月更文挑战第7天】在数字化时代,后端开发成为支撑整个互联网生态的关键。其中,API设计作为后端开发的核心组成部分,其优劣直接影响着系统的稳定性、可扩展性以及用户体验。本文将深入探讨API设计中应遵循的几项基本原则,包括简洁性、一致性、安全性、版本控制以及文档化,旨在为后端开发者提供一套实用的设计指南,帮助他们构建出更加高效、安全且易于维护的API。
46 10
|
12天前
|
安全 API 数据安全/隐私保护
后端开发中的API设计原则与实践
【8月更文挑战第7天】在数字化时代,API(应用程序接口)是连接不同软件组件和服务的桥梁。一个良好设计的API不仅能够提升开发效率,还能增强系统的可维护性和扩展性。本文将探讨一些关键的API设计原则,并结合实例分析这些原则在后端开发中的应用和重要性。
|
10天前
|
存储 API 网络架构
深入浅出:后端开发中的RESTful API设计原则
在数字化浪潮的推动下,后端开发成为构建现代网络服务不可或缺的一环。本文将引导你理解RESTful API的设计哲学,探索如何通过简洁而强大的设计来提升后端服务的可维护性与扩展性。我们将从REST的基本概念出发,逐步深入到API设计的实战技巧,最终实现高效且优雅的后端架构。
|
15天前
|
存储 缓存 API
深入理解RESTful API设计原则与实践
在现代Web开发中,RESTful API已成为一种广泛采用的架构风格。它基于Representational State Transfer (REST)原则,强调资源的状态转化。本文将探讨RESTful API的核心概念、设计原则以及如何在实际项目中应用这些理念来构建高效、可维护的后端服务。文章还将分享一些最佳实践和常见误区,帮助开发者更好地理解和运用RESTful API设计。
|
16天前
|
存储 JSON JavaScript
深入理解RESTful API设计原则
【8月更文挑战第3天】在数字化时代,APIs(应用程序编程接口)已经成为连接不同软件和服务的桥梁。RESTful API,作为一种流行的设计风格,其背后的原则和实践对于构建可维护、可扩展且用户友好的后端服务至关重要。本文将通过实例探讨如何应用这些原则来设计和实现高效、易于理解的RESTful API。
|
20天前
|
JSON 安全 API
深入理解RESTful API设计原则与最佳实践
【7月更文挑战第30天】在数字化时代,RESTful API成为连接不同软件系统的桥梁。本文旨在揭示其背后的设计哲学、核心原则以及应用最佳实践,帮助开发者构建高效、可扩展且易于维护的后端服务接口。
28 5
|
3天前
|
存储 缓存 API
深入理解RESTful API设计原则与实践
【7月更文挑战第47天】在当今互联网应用的构建中,后端系统通常需要通过API与前端或其他服务进行通信。本文将探讨RESTful API的设计原则,并通过实例展示如何在实践中有效地应用这些原则来创建易于维护、可扩展且用户友好的后端服务接口。我们将分析RESTful架构风格的核心概念,包括资源、统一接口、无状态性和分层系统,并讨论如何在真实世界中实现这些理论。