如何保护 Android 应用程序中的 Azure 翻译 API 密钥

Posted

技术标签:

【中文标题】如何保护 Android 应用程序中的 Azure 翻译 API 密钥【英文标题】:How to secure Azure Translation API key in Android App 【发布时间】:2021-06-01 23:03:46 【问题描述】:

我正在开发 android 翻译应用程序。该应用使用 Azure 认知服务文本翻译 API 密钥。

API 密钥在 Java 文件中的 App 源代码中,如果我发布应用程序,人们可以破解应用程序 apk 文件并使用我的 API 密钥,这将是相当昂贵的。有没有办法保护我的 API 密钥不被盗?该应用无需登录,无需登录,任何人都可以从Play商店下载。

如何保护 API 密钥不被盗?

【问题讨论】:

既然你已经在使用Azure,我想这个问题已经在这里***.com/questions/56150164/…得到了解答。 【参考方案1】:

您可以使用 android Keystore 来解决像您这样的场景official docs

或者可以参考示例代码here

【讨论】:

【参考方案2】:

逆向工程

API 密钥在 Java 文件中的 App 源代码中,如果我发布该应用程序,人们可以破解该应用程序的 apk 文件并使用我的 API 密钥

是的,而且当有很多不同的开源软件可以轻松完成这项任务时,这并不难,即使是非技术人员也能轻松完成,就像我在文章中使用移动安全框架进行演示一样 How to Extract an API key from a Mobile App with Static Binary Analysis:

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

另外,您可以在 MobSF 的上传目录中使用 grep 命令来查找 MobSF 无法找到的其他秘密:

grep -irl '_key"' --include 'strings.xml' --include "AndroidManifest.xml"

grep -irn '_key' --include '*.java' --include "*.smali" ./java_source/tld/domain ./smali_source/tld/domain

_key 替换为您可能想要查找的任何其他模式。

tld/domain 替换为被逆向工程的移动应用使用的那个,例如:com/example

隐藏在原生 C 代码中的秘密

秘密可以隐藏在本机 C 代码中,就像上面链接的 article 上的演示一样:

在本文中,我们将使用 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 密钥。最后,您将了解如何缓解中间人攻击。

硬件密钥库或保险库中的秘密

MitM 攻击的替代方法是使用检测框架在运行时挂钩检索密钥的代码,无论是来自 Android 硬件烘焙密钥库还是来自您选择的云提供商提供的任何其他保险库:

Frida:

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

第三方服务

API密钥在Java文件的App源代码中,如果我发布应用程序,人们可以破解应用程序的apk文件并使用我的API密钥,这将是相当昂贵的。

是的,它可能非常昂贵,而且您只有在账单已经很大时才会发现它,尽管您可以设置账单提醒,但它们并没有像您想象的那样工作。

反向代理救援

有没有办法保护我的 API 密钥不被盗?

最佳实践不建议直接从移动应用程序中使用第三方服务,而是应将它们委托给移动应用程序的 API 后端或反向代理,正如我在我的另一篇文章 @987654331 中所写@:

在本文中,您将首先了解什么是第三方 API,以及为什么不应该直接从移动应用中访问它们。接下来,您将了解什么是反向代理,以及何时以及为何使用它来保护对移动应用中使用的第三方 API 的访问。

所以,现在您可能认为您只是从保护访问翻译 API 的秘密转移到访问反向代理或 API 后端的秘密,您是对的,但有很大的不同,这使得所有不同之处在于,您可以控制反向代理和/或 API 后端,因此您可以密切监控流量、限制/关闭流量,并根据需要应用尽可能多的安全防御措施来控制一切。

开放 API

应用中无需登录,无需登录,任何人都可以从Play商店下载。

因此,您创造了一种无摩擦的用户体验,但您也创造了一个需要自己解决的安全噩梦。

在我深入研究更多细节之前,重要的是首先澄清关于 what 访问后端之间的区别的一些误解。

访问 API 服务器的对象和对象的区别

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

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

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

您可以将 视为您的 API 后端或反向代理能够对数据进行身份验证和授权访问的用户(如果您正在使用它),并考虑 >什么代表用户提出该请求的软件。

在开放式 API 中,您无法识别请求中的,但即使您能够识别,使用 API 后端或 Reverse 锁定移动应用程序也不够代理。

因此,您需要加强将第三方服务委托给您自己的后端或反向代理的能力,就是找到一种使用移动应用程序锁定它们的方法。

可能的附加解决方案

有没有办法保护我的 API 密钥不被盗?

移动应用程序和 API 后端和/或反向代理可以通过引入移动应用程序证明概念以仅接受来自您的移动应用程序的真实和未篡改版本的请求的方式锁定它们,从而将它们紧密结合在一起,我建议您阅读this answer 我提出的问题如何保护移动应用程序的 API REST?,尤其是强化和屏蔽移动应用程序部分,保护 API 服务器和可能的更好解决方案,以了解更多防御技术并了解移动应用证明。

简而言之,移动应用程序证明解决方案将允许任何后端以非常高的信心断言请求确实来自您所期望的什么,即您的手机的真实且未经篡改的版本应用程序,也不是来自机器人、脚本、cURL 或任何其他工具。

你想加倍努力吗?

在回答安全问题时,我总是喜欢参考 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) 是移动应用安全开发、测试和逆向工程的综合手册。

【讨论】:

【参考方案3】:

另一种使您的密钥难以逆向工程的方法是将它们作为本机代码保存在 NDK 中。

【讨论】:

【参考方案4】:

另一种解决方案是创建您自己的服务代理,这是您的 REST 服务,它接受用户请求,从 AWS 获取翻译响应,并将响应发送回移动设备。

优点是密钥不会存储在移动设备上,而缺点是您的 REST 服务会成为单点故障,因此您可能需要提供冗余服务器。

但是,由于您的服务是轻量级的,它应该可以很好地扩展。

【讨论】:

以上是关于如何保护 Android 应用程序中的 Azure 翻译 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Azure AD B2C 保护 Blazor Wasm 应用访问的 Azure 函数?

使用即时VM访问保护Azure VM

如何使用Azure AD B2C保护Spring Boot REST API?

Azure-> Node.js 中的 Easy api-> 如何发送 android 推送通知?

如何保护 Android apk 包中的 rapidapi 密钥

在 AAD 保护的 Azure Web 应用程序中检索访问令牌