如何在安卓上安全地存储硬编码的API密钥?

8
在我的Android项目中,我想以安全的方式存储一个API密钥。该密钥是从应用程序外部生成的,并需要以某种方式存储在应用程序构建之前
我看过一些关于如何使用KeyStore(例如像这个这个)的示例,但据我所了解,这些都是用来存储在运行时生成的秘密密钥的解决方案,而不是我将要存储在代码中的密钥。
我还检查了这里介绍的其他方法,但它们看起来很容易通过反向工程来检索API密钥。
我也不想把密钥存储在我的代码中,因为它很容易被反向工程检索到。
其目的是在每次调用我制作的Web服务时发送该密钥,以便我确信(或几乎可以确信)该调用来自我正在制作并将在Play商店上发布的原始应用程序,而不是其他地方。
由于我远非安全专家,因此任何帮助都将不胜感激。

1
请参考以下文章了解关键存储、在gradle.properties中存储秘密和其他安全细节: https://dev59.com/VVsV5IYBdhLWcg3w2h0s https://dev59.com/D1QK5IYBdhLWcg3wL9Bq https://developer.android.com/training/articles/keystore.html - Abhimanyu
谢谢,我会看一下。 - matteoh
@matteoh,您解决了这个问题吗? - Giru Bhai
@GiruBhai 还没有。 - matteoh
1个回答

14

你的挑战

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

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

必须清楚地理解API请求中什么之间的区别,否则您可能设计/使用的任何安全解决方案都可能无法产生预期的结果。

访问API服务器的什么之间的区别

我撰写了一系列关于API和移动安全性的文章,在文章为什么你的移动应用需要API密钥?中,您可以详细阅读有关什么访问您的API服务器之间的区别,但我将在此处提取其中的主要内容:

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

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

因此,您需要将视为API服务器将能够对其进行身份验证和授权以访问数据的用户,而将什么视为代表用户发出请求的软件。

反向工程

我也不想在我的代码中存储密钥,因为这样很容易通过反向工程来检索。

这是非常正确的,这取决于用于隐藏API密钥的方法,就像您提到的那些方法一样:

我还检查了这里解释的其他方法,但是它们看起来很容易被反向工程检索到API密钥。

无论API密钥存储得多么安全,例如在Android Keystore中、加密、混淆等,最终API密钥都需要以明文形式发送到API请求头中,在此时,它容易被通过静态反向工程、MitM攻击或仪器化框架来提取。
我已经写了一篇文章如何通过静态二进制分析从移动应用程序中提取API密钥,以说明这可以是多么容易的事情。
开源工具的范围非常广,用于逆向工程的工具也不在少数。本文无法详细介绍所有工具,我们将重点介绍如何使用Mobile Security Framework(MobSF)来逆向分析我们的移动应用程序的APK文件。MobSF是一组开源工具,它们会在一个漂亮的仪表板上展示结果。但是,在MobSF和其他地方使用的相同工具也可以单独使用以达到相同的结果。

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

我还写了另一篇文章来实现运行时获取API密钥,使用中间人攻击窃取API密钥:

为了演示如何窃取API密钥,我已经构建并在Github发布了一个名为Currency Converter Demo的Android应用程序,它使用了和我们之前在Android Hide Secrets应用程序中使用的JNI/NDK技术来隐藏API密钥。因此,在本文中,您将学习如何设置和运行MitM攻击以拦截您控制下的移动设备上的https流量,以便窃取API密钥。最后,您将从高层次上看到如何缓解MitM攻击。
一个仪器化框架也可以在运行时用于钩入使用API密钥的代码以提取它。例如,使用流行的Frida框架
将自己的脚本注入黑盒进程。挂钩任何函数,监视加密API或跟踪私有应用程序代码,无需源代码。编辑,保存,即可立即查看结果。所有这些都不需要编译步骤或程序重新启动。
因此,无论对API密钥采取了什么保护措施,一旦它在API上,请求就会容易被提取。
移动API安全
在客户端运行并需要某些秘密才能访问API的任何内容都可能被不同方式滥用,您可以在这个系列的文章中了解更多关于移动API安全技术的信息。这些文章将教您如何使用API密钥、用户访问令牌、HMAC和TLS Pinning来保护API以及如何绕过它们。
可能的解决方案
我建议您阅读我在问题“如何保护移动应用的API REST安全?”中提供的答案,特别是“加强和保护移动应用程序”、“保护API服务器”和“可能更好的解决方案”部分。
您的问题可能的最佳解决方案是使用移动应用程序认证,让您的后端知道正在发出请求的是什么,确实是您的移动应用程序的真实和未篡改版本,正如您所希望的:

它的目的是每次调用我制作的Web服务时都能发送该密钥,以便我确信(或几乎确信)该调用来自于我正在制作并将发布到Play商店的原始应用程序,而不是其他地方。

您想再做多一点吗?

对于任何安全问题的回答,我都喜欢引用OWASP基金会的优秀工作。

对于APIs

OWASP API安全前10名

OWASP API安全项目旨在通过强调不安全API的潜在风险并说明如何减轻这些风险,为软件开发人员和安全评估人员提供价值。为了实现这个目标,OWASP API安全项目将创建和维护一个前十个API安全风险文档,以及一个有关创建或评估API时最佳实践的文档门户。
对于移动应用程序: OWASP移动安全项目-前10个风险 OWASP移动安全项目是一个集中资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是分类移动安全风险并提供开发控件以减少它们的影响或被利用的可能性。 OWASP-移动安全测试指南
移动安全测试指南(MSTG)是一本综合手册,用于移动应用程序安全开发、测试和反向工程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接