将API请求限制为仅限我自己的移动应用

Thi*_*ago 37 security mobile android ios

有没有办法将发布请求限制到我的REST API只限于来自我自己的移动应用程序二进制文件的请求?此应用程序将在Google Play和Apple App Store上发布,因此应该暗示有人可以访问其二进制文件并尝试对其进行反向工程.

我正在考虑涉及应用程序签名的内容,因为每个已发布的应用程序都必须以某种方式签名,但我无法弄清楚如何以安全的方式执行此操作.也许结合获取应用程序签名,加上基于时间的哈希,加上应用程序生成的密钥对和良好的旧安全性,虽然默默无闻?

我正在寻找尽可能失败证明的东西.原因是因为我需要根据手机传感器收集的数据向应用程序提供数据,如果人们可以伪装成我自己的应用程序并将数据发送到我自己的算法未处理的api,它就会失败目的.

无论多么复杂,我都愿意接受任何有效的解决方案.非常感谢锡箔帽解决方案.

Mar*_*ams 20

用户可以公开存储在应用程序中的任何凭据.在Android的情况下,他们可以完全反编译您的应用程序并轻松检索它们.

如果与服务器的连接不使用SSL,则可以轻松地从网络中嗅探它们.

说真的,任何想要凭据的人都会得到它们,所以不要担心隐藏它们.实质上,您有一个公共API.

存在一些陷阱,管理公共API需要额外的时间.

许多公共API仍然按IP地址跟踪并实施tarpits,以简单地减慢来自任何似乎滥用系统的IP地址的请求.这样,来自同一IP地址的合法用户仍然可以继续,尽管速度较慢.

您必须愿意关闭IP地址或IP地址范围,尽管您可能在滥用者的同时阻止无辜和正直的用户.如果您的申请是免费的,它可能会给您更多的自由,因为没有预期的服务水平和合同,但您可能希望通过法律协议来保护自己.

一般来说,如果你的服务很受欢迎,有人想攻击它,那通常是一个好兆头,所以不要过早担心它,但要保持领先.您不希望应用程序失败的原因是因为用户厌倦了在慢速服务器上等待.

您的另一个选择是让用户注册,因此当您发现滥用时,您可以通过凭据而不是IP地址阻止.


Exa*_*a37 16

是的,它是公开的

此应用程序将在 Google Play 和 Apple App Store 上分发,因此应该暗示有人可以访问其二进制文件并尝试对其进行逆向工程。

从它在商店中的那一刻起它就是公开的,因此应用程序二进制文件中的任何敏感内容都必须被视为可能受到损害。

WHO 和 WHAT 访问 API 服务器的区别

在深入探讨您的问题之前,我想首先澄清一个关于什么正在访问 API 服务器的误解。我写了一系列关于 API 和移动安全的文章,在文章为什么你的移动应用程序需要 Api 密钥?你可以详细阅读之间的区别什么是访问您的API服务器,但我会在这里提取它的主要花费:

向 API 服务器发出请求的内容什么。它真的是您的移动应用程序的真实实例,还是机器人、自动化脚本或攻击者使用 Postman 之类的工具手动浏览您的 API 服务器?

是移动应用,我们可以验证,授权和以多种方式确定,比如使用OpenID登录连接或流的oauth2的用户。

考虑是您的 API 服务器将能够对数据进行身份验证和授权访问的用户,并考虑代表用户发出该请求的软件是什么

所以,如果你没有在应用程序中使用用户认证,那么你就离开,试图证明什么做的请求。

移动应用程序应该尽可能的愚蠢

原因是因为我需要根据手机传感器收集的数据将数据传送到应用程序,如果人们可以冒充我自己的应用程序并将数据发送到我自己的算法未处理的 api,它就会打败它目的。

在我看来,您是在说您在手机上运行算法来处理来自设备传感器的数据,然后将它们发送到 API 服务器。如果是这样,那么您应该重新考虑这种方法,而只是收集传感器值并将它们发送到 API 服务器并让它运行算法。

正如我所说,您的应用程序二进制文件中的任何内容都是公开的,因为正如您所说,它可以被逆向工程:

应该暗示有人将可以访问其二进制文件并尝试对其进行逆向工程。

将算法保留在后端将允许您不透露您的业务逻辑,同时您可能会拒绝带有没有意义的传感器读数的请求(如果可能的话)。这还为您带来了每次调整算法或修复其中的错误时不必发布新版本应用程序的好处。

运行时攻击

我在想一些涉及应用程序签名的事情,因为每个发布的应用程序都必须以某种方式签名,但我不知道如何以安全的方式进行签名。

您在运行时为保护即将发送到 API 的请求所做的任何事情都可以使用Frida 之类的工具进行逆向工程:

将您自己的脚本注入黑盒进程。挂钩任何函数,监视加密 API 或跟踪私有应用程序代码,无需源代码。编辑,点击保存,并立即查看结果。无需编译步骤或程序重新启动。

您建议的解决方案

安全是关于防御层,因此您应该添加尽可能多的法律(例如欧洲的 GDPR),因此您的任何有目的的解决方案都是攻击者需要绕过的另一层,并且取决于技能- 设置和时间愿意花在您的移动应用程序上可能会阻止他们走得更远,但最终所有这些都可以绕过。

也许是获取应用程序签名、基于时间的散列、应用程序生成的密钥对以及虽然晦涩难懂的旧安全性的组合?

即使您使用存储在硬件可信执行环境中的密钥对,攻击者所需要做的就是使用检测框架来挂钩使用这些密钥的代码的功能,以便提取或操作参数和返回值功能。

Android 硬件支持的密钥库

片上系统 (SoC) 中可信执行环境的可用性为 Android 设备提供了向 Android 操作系统、平台服务甚至第三方应用程序提供硬件支持的强大安全服务的机会。

虽然它可以被打败我仍然建议你使用它,因为不是所有的黑客都有技能或愿意花时间在它上面,我建议你阅读关于移动 API 安全技术的这一系列文章来了解一些与您描述的技术互补/相似的技术。本文将教您如何使用 API 密钥、用户访问令牌、HMAC 和 TLS 固定来保护 API 以及如何绕过它们。

可能的更好解决方案

现在我看使用Android安全网来证明开发商是什么做的请求,API服务器,但他们不知道它是不是为了证明,移动应用是什么做的请求,而不是它的目的是证明设备的完整性,我更详细地回答Android 等效于 ios devicecheck的问题。那我应该使用它吗?是的,您应该这样做,因为它是另一层防御,在这种情况下,它会告诉您您的移动应用程序未安装在有 root 权限的设备中,除非 SafetyNet 已被绕过。

有什么方法可以将我的 REST API 的发布请求限制为来自我自己的移动应用程序二进制文件的请求?

通过实现移动应用证明概念,您可以让 API 服务器具有高度的信心,它确实只接受来自您的正版应用二进制文件的请求,我在这个回答中更详细地描述了我对问题如何保护用于移动应用程序的 API REST?,特别是保护 API 服务器一个可能的更好的解决方案部分

你想去“额外一英里”吗?

在对安全问题的任何回答中,我总是喜欢参考 OWASP 基金会的出色工作。

用于APIS

OWASP API 安全前 10 名

OWASP API 安全项目旨在通过强调不安全 API 中的潜在风险并说明如何减轻这些风险来为软件开发人员和安全评估人员提供价值。为了实现这一目标,OWASP API 安全项目将创建和维护一个前 10 个 API 安全风险文档,以及创建或评估 API 时最佳实践的文档门户。

对于移动应用程序

OWASP 移动安全项目 - 十大风险

OWASP 移动安全项目是一个集中资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类并提供开发控制以减少其影响或被利用的可能性。

OWASP - 移动安全测试指南

移动安全测试指南 (MSTG) 是移动应用安全开发、测试和逆向工程的综合手册。


kab*_*uko 12

不.您正在发布具有公共界面的服务,您的应用程序可能只通过此REST API进行通信.您的应用可以发送的任何内容,其他人也可以发送.这意味着保护访问的唯一方法是以某种方式进行身份验证,即保密.但是,您也在发布您的应用.这意味着您的应用程序中的任何秘密基本上也被赋予了.你无法双管齐下; 你不能指望两者都透露你的秘密并保守秘密.


Rea*_*hed 9

虽然这是一篇旧帖子,但我认为我应该分享谷歌在这方面的更新。

您实际上可以确保您的 Android 应用程序使用SafetyNet 移动认证 API调用API。这会增加网络调用的一些开销,并阻止您的应用程序在有根设备中运行。

我没有发现类似 SafetyNet for iOS 的东西。因此,就我而言,我首先在登录 API 中检查了设备配置,并对 Android 和 iOS 采取了不同的措施。对于 iOS,我决定在服务器和应用程序之间保留一个共享密钥。由于 iOS 应用程序有点难以逆向工程,我认为这个额外的密钥检查增加了一些保护。

当然,在这两种情况下,您都需要通过 HTTPS 进行通信。


Ami*_*ati 5

你无能为力。因为当你让某人进来时,他们可以调用你的 API。您最多可以做如下:

由于您只希望您的应用程序(具有特定的包名称和签名)调用您的 API,因此您可以实用地获取 apk 的签名密钥,并在每个 API 调用中发送服务器,如果可以,您将响应该请求。(或者您可以拥有一个令牌 API,您的应用程序在应用程序的每个开头都会调用它,然后将该令牌用于其他 API - 尽管令牌在不使用几个小时后必须失效)

那么你需要混淆你的代码,这样没有人会看到你发送的内容以及你如何加密它们。如果加密做得好,反编译就会很难做到。

即使是 apk 的签名也可以通过一些困难的方式来嘲笑,但这是你能做的最好的。

  • 签名并不难欺骗,因为它是由客户端发送的,并且客户端完全控制发送的内容。Proguard 并确保仅从应用程序对 API 进行加密 (SSL/TLS) 调用(除了固定证书之外)可以通过隐蔽性提供一些不错的安全性,直到他们解密源代码、关闭证书固定并在中间攻击以查看发送的内容。 (8认同)