【问题标题】:How to securely store a hardcoded API key on Android?如何在 Android 上安全地存储硬编码的 API 密钥?
【发布时间】:2022-01-03 19:06:57
【问题描述】:

在我的 Android 项目中,我想以安全的方式存储 API 密钥。该密钥是从应用外部生成的,需要在构建应用之前以某种方式存储在应用中。

我已经看到了一些如何使用 KeyStore 的示例(例如 thisthis),但据我了解,这些是存储运行时生成的密钥的解决方案,而不是我想要的密钥存储在我的代码中。

我还检查了here 解释的其他方法,但由于逆向工程,它们看起来很容易检索到 API 密钥。

我也不想将我的密钥存储在我的代码中,因为它可以通过逆向工程轻松检索。

它的目的是能够在我每次调用我创建的网络服务时发送该密钥,所以我确信(或几乎可以肯定)调用来自我正在制作的原始应用程序并且将在 Play Store 上发布,而不是从其他地方发布。

我远不是安全专家,因此我们将不胜感激。

谢谢。

【问题讨论】:

标签: android android-keystore


【解决方案1】:

你的挑战

它的目的是能够在我每次调用我创建的网络服务时发送该密钥,所以我确信(或几乎可以肯定)调用来自我正在制作的原始应用程序并且将在 Play Store 上发布,而不是从其他地方发布。

这是一项非常艰巨的任务,但并非不可能完成,因此需要深入了解移动 API 安全性并了解其背后的机制。

清楚了解 API 请求中的与发出 API 请求的什么之间的区别至关重要,否则您可能设计的任何安全解决方案/使用可能没有预期的结果。

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

我写了一系列关于 API 和移动安全的文章,在文章 Why Does Your Mobile App Need An Api Key? 你可以详细阅读 what 访问你的API 服务器,但我将在这里提取它的主要内容:

what 是向 API 服务器发出请求的事物。它真的是您的移动应用程序的真实实例,还是机器人、自动脚本或攻击者使用 Postman 之类的工具手动绕过您的 API 服务器?

是移动应用的用户,我们可以通过多种方式进行身份验证、授权和识别,例如使用 OpenID Connect 或 OAUTH2 流。

因此,您需要考虑作为您的 API 服务器将能够验证和授权访问数据的用户,并且您需要考虑什么 strong> 作为代表用户发出请求的软件。

逆向工程

我也不想将我的密钥存储在我的代码中,因为它可以通过逆向工程轻松检索。

确实如此,根据您提到的用于隐藏 API 密钥的方法,它或多或少很容易实现:

我还检查了此处说明的其他方法,但由于逆向工程,它们看起来很容易检索 API 密钥。

无论 API 密钥的存储有多安全,无论是在 Android 密钥库中、加密、混淆等,在某些时候,API 密钥都需要以纯文本形式在 API 请求标头上发送,并且目前,它很容易通过静态逆向工程、中间人攻击或检测框架被提取

我写了文章How to Extract an API key from a Mobile App with Static Binary Analysis来说明它是多么容易做到:

可用于逆向工程的开源工具种类繁多,我们在本文中确实无法触及这个主题的表面,而是将重点使用Mobile Security Framework(MobSF) 来演示如何逆向工程我们的移动应用程序的 APK。 MobSF 是一组开源工具,它们在一个有吸引力的仪表板中展示其结果,但在 MobSF 和其他地方使用的相同工具可以单独使用以实现相同的结果。

在本文中,我们将使用 Android Hide Secrets 研究存储库,它是一个使用多种不同技术隐藏 API 密钥的虚拟移动应用程序。

我还写了另一篇文章在运行时实现它,Steal that Api Key with a Man in the Middle Attack

为了帮助演示如何窃取 API 密钥,我在 Github 中构建并发布了适用于 Android 的 Currency Converter Demo 应用程序,它使用了我们在之前的 Android Hide Secrets 应用程序中使用的相同 JNI/NDK 技术来@ 987654329@.

因此,在本文中,您将学习如何设置和运行中间人攻击,以拦截您控制的移动设备中的 https 流量,从而窃取 API 密钥。最后,您将了解如何缓解中间人攻击。

还可以在运行时使用检测框架来挂钩使用 API 密钥的代码,以便提取它。例如流行的Frida framework

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

所以,无论采取什么措施来保护 API 密钥,一旦它在 API 请求上,就很容易被提取。

移动 API 安全

在客户端运行并且需要一些秘密才能访问 API 的任何东西都可能以不同的方式被滥用,您可以在 this series 有关移动 API 安全技术的文章中了解更多信息。本文将教您如何使用 API Keys、用户访问令牌、HMAC 和 TLS Pinning 来保护 API 以及如何绕过它们。

可能的解决方案

我建议您阅读this answer我提出的问题如何保护移动应用程序的 API REST?,尤其是强化和屏蔽移动应用程序部分保护 API 服务器可能更好的解决方案

Mobile App Attestation 知道针对您的问题可能的最佳解决方案,这将使您的后端知道 什么 发出请求确实是您的移动应用程序的真实且未经篡改的版本,因为您希望达到:

它的目的是能够在我每次调用我创建的网络服务时发送该密钥,所以我确信(或几乎可以肯定)调用来自我正在制作的原始应用程序并且将在 Play Store 上发布,而不是从其他地方发布。

你想加倍努力吗?

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

对于 APIS

OWASP API Security Top 10

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

对于移动应用

OWASP Mobile Security Project - Top 10 risks

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

OWASP - Mobile Security Testing Guide:

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

【讨论】:

    猜你喜欢
    • 2015-07-21
    • 2015-03-24
    • 1970-01-01
    • 2021-12-12
    • 2015-11-24
    • 2018-03-16
    • 2020-01-28
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多