我读过很多关于这个主题的文章,它们都提出了完全不同的东西,我还不能在我的脑海中构建。
我有一个后端应用程序(spring-boot +Kotlin)。我有nginx和一个android(kotlin)移动的应用程序使用后端API,当然还有Postgres。顺便说一下,后端应用程序和postgres是通过docker-compose在docker container中的包。
我的任务是让我的后端服务的API只能被这个移动的应用使用,其他人都不能使用。但我也希望它能够在我将来有Web应用的情况下使用这个API。
如果你能用几句话描述一下可以用来完成我的任务的现代技术,我将不胜感激,例如:
- spring security :一个巨大的东西,你不知道该怎么做,最有可能你可以用它来解决你的问题,但它是矫枉过正。但如果你决定使用Spring安全,这将帮助你{...}
...
顺便说一句,我并不反对 Spring 安保,我只是真的认为这对我的工作来说太多了。但我很乐意听听你的意见。
2条答案
按热度按时间pcww981p1#
你的问题
我的任务是让我的后端服务的API只能被这个移动的应用使用,其他人都不能使用。但我也希望它能够在我将来有Web应用的情况下使用这个API。
你手上有一个非常艰巨的任务要完成,虽然不是不可能完成,但通过你自己编写的代码或尝试在你选择的框架上利用安全特性是非常困难的。
要理解为什么这么难,您首先需要理解请求中的谁与执行请求的什么之间的区别。
访问API服务器的对象和内容之间的区别
我写了一系列关于API和移动的安全的文章,在文章Why Does Your Mobile App Need An Api Key?中,您可以详细阅读访问您的API服务器的谁和什么之间的区别,但我将在这里摘录主要内容:
向API服务器发出请求的东西是什么?它真的是您的移动的应用的真实示例,还是一个机器人、自动脚本或攻击者使用Postman等工具手动窥探您的API服务器?
who是移动的应用程序的用户,我们可以通过几种方式进行身份验证、授权和标识,如使用OpenID Connect或OAUTH2流。
因此,考虑谁作为您的API服务器将能够验证和授权访问数据的用户,并考虑什么作为代表用户发出请求的软件。
在您理解了这一理念并将其根植于您的思维中之后,您将从另一个Angular 来研究移动的API安全性,您将能够看到您从未想过它们可能存在的攻击面。
可能的解决方案
如果你能用几句话描述一下可以用来完成我的任务的现代技术,我将不胜感激。
我建议您阅读this answer,我给出的问题 * 如何保护移动的应用程序的API REST?*,特别是部分 * 硬化和屏蔽移动应用程序 , 保护API服务器 * 和 * 一个可能的更好的解决方案 *。
解决您问题的最佳方法是采用我链接的答案中建议的移动的应用认证解决方案。移动应用认证需要能够与您的移动应用和后端协同工作,以便后端非常有信心地确定发出请求的确实是您的移动应用的正版。没有被静态或运行时篡改,并且不在MitM Attack下
中间操纵者攻击(MITM)拦截两个系统之间的通信。例如,在http事务中,目标是客户端和服务器之间的TCP连接。攻击者使用不同的技术将原始TCP连接拆分为两个新连接,一个连接在客户端和攻击者之间,另一个连接在攻击者和服务器之间。如图1所示。一旦TCP连接被拦截,攻击者就充当代理,能够读取、插入和修改被拦截通信中的数据。
MITM攻击非常有效,因为http协议和数据传输都是基于ASCII的。通过这种方式,可以在http协议内以及传输的数据中查看和访问。因此,例如,可以捕获阅读http标头的会话cookie,但也可以更改应用程序上下文内的金额交易
请注意,特定于后端或移动的应用程序的解决方案将无法在保护API后端免受服务请求(并非源自真正的移动应用程序)方面实现非常高的信心,但拥有这些解决方案总比什么都没有好。
你想走更远的路吗?
在回答任何安全问题时,我总是喜欢引用OWASP基金会的优秀工作。
适用于APIS
OWASP API Security Top 10
OWASP API安全项目旨在通过强调不安全API的潜在风险,并说明如何降低这些风险,为软件开发人员和安全评估人员提供价值。为了实现这一目标,OWASP API安全项目将创建和维护一个十大API安全风险文档,以及一个创建或评估API时的最佳实践的文档门户。
移动的应用程序
OWASP移动的安全项目-十大风险
OWASP移动的安全项目是一个集中的资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类,并提供开发控制措施,以降低其影响或被利用的可能性。
OWASP - Mobile Security Testing Guide:
移动的安全测试指南(MSTG)是一本全面的移动应用安全开发、测试和逆向工程手册。
zpf6vheq2#
最简单的方法可能是在电话和后端服务上定义一个共享密钥。
在移动的电话上,对于每个请求,您发送秘密,例如作为HTTP报头。
在后端,您需要实现一个Filter(例如,OncePerRequestFilter),它检查请求中的机密信息,并将其与存储在后端的值进行比较。