react-native 应用程序中如何保护敏感数据
Posted
技术标签:
【中文标题】react-native 应用程序中如何保护敏感数据【英文标题】:How secure sensitive data in react-native app 【发布时间】:2021-05-12 12:49:51 【问题描述】:在我的应用程序中,我与 keycloak 建立了连接,用于获取 API 密钥和用于保存用户数据的安全存储。
我如何确保安全:
secret id 需要连接到 keycloak 访问安全存储的密钥我阅读了不同的文章,但没有找到正确保护这些数据的方法。来自 APK 的简单还原工程显示秘密数据。
混淆代码是可能的,但这不是一个严肃的解决方案,这对性能有很大影响。
【问题讨论】:
答案仍然与所有应用程序相同,无论是普通的 android 还是 React Native 或任何应用程序:您无法保护这些信息。您只能混淆数据,因此使攻击者更难找到它们但最终提取信息只是时间问题。另见***.com/questions/14570989/… 【参考方案1】:用另一个问题交换一个问题
在我的应用程序中,我与 keycloak 建立了连接,用于获取 API 密钥和用于保存用户数据的安全存储。
因此,使用 KeyCloak 在运行时检索 API 密钥以免在移动应用中对其进行硬编码,只是将问题从保护 API 密钥转移到保护 KeyCloak 密钥。
从移动应用程序中提取秘密
我如何确保安全:
secret id 需要连接到 keycloak 访问安全存储的密钥
残酷的事实是,您无法妥善保护它们,因为您在移动应用程序发布中发布的任何秘密都必须被视为属于公共领域,因为它在客户端,因此任何人都可以花时间他/她想通过静态或动态分析对移动应用进行逆向工程以提取它。
您可以使用 JNI/NDK 隐藏 Natice C 代码中的秘密,正如我在文章 How to Extract an API key from a Mobile App with Static Binary Analysis 中所展示的:
可用于逆向工程的开源工具范围很广,我们在本文中确实无法触及这个主题的表面,而是将重点使用Mobile Security Framework(MobSF) 来演示如何逆向工程我们的移动应用程序的 APK。 MobSF 是一组开源工具,它们在一个有吸引力的仪表板中展示其结果,但在 MobSF 和其他地方使用的相同工具可以单独使用以实现相同的结果。
现在,由于隐藏在本机 C 代码中的秘密,提取它会很耗时,但并非不可能。因此,如果您无法通过静态逆向工程轻松做到这一点,那么您可以使用 MitM 攻击来做到这一点,正如我在文章 Steal that Api Key with a Man in the Middle Attack 中所展示的那样:
为了帮助演示如何窃取 API 密钥,我在 Github 中构建并发布了适用于 Android 的 Currency Converter Demo 应用程序,它使用了我们在之前的 Android Hide Secrets 应用程序中使用的相同 JNI/NDK 技术来@ 987654327@.
因此,在本文中,您将学习如何设置和运行中间人攻击,以拦截您控制的移动设备中的 https 流量,从而窃取 API 密钥。最后,您将了解如何缓解中间人攻击。
你明白了吗?您可以通过静态二进制分析使其难以提取,但是攻击者只需要使用 mitmproxy 之类的工具来拦截流量并在请求的标头中查找 API 密钥。
您可以尝试保护您的移动应用免受中间人攻击,我在我的文章 Securing HTTPS with Certificate Pinning 中举例说明:
为了演示如何使用证书固定来保护您的移动应用和 API 服务器之间的 https 流量,我们将使用我在上一篇文章中使用的相同 Currency Converter Demo 移动应用。
在本文中,我们将了解什么是证书固定、何时使用、如何在 Android 应用中实现它,以及它如何防止中间人攻击。
但是,您需要注意,您也可以绕过固定,正如我在下一篇文章 Bypass Certificate Pinning 中展示的那样:
为了演示如何绕过证书固定,我们将使用上一篇文章中使用的相同货币转换器演示移动应用程序。
在本文中,您将学习如何重新打包移动应用程序以使其信任自定义 ssl 证书。这将允许我们绕过证书固定。
攻击者的其他替代方法是使用检测框架挂钩从密钥库或 KeyCloak 服务器返回秘密或 API 密钥的代码。用于此类攻击的流行检测框架是Frida:
将您自己的脚本注入黑盒进程。挂钩任何功能、监视加密 API 或跟踪私有应用程序代码,无需源代码。编辑,点击保存,立即查看结果。所有这些都无需编译步骤或程序重新启动。
因此,当代码没有被混淆时,在代码中使用 Frida 连接会更容易,因为通过使用一些可猜测的函数名称对代码进行一些搜索,很容易找到执行此操作的函数,或者只是求助在 IDE 的帮助下遵循代码流。
代码混淆及其重要性
混淆代码是可能的,但这不是一个严肃的解决方案,这对性能有很大影响。
是的,你说得对,代码混淆不会隐藏秘密,只会让人难以理解逻辑流程。
代码混淆仍然应该在您的移动应用程序安全加固列表中,并且一旦用作Google recommends,通过压缩代码和资源,使用 R8 混淆和优化您的应用程序,然后您将不会有一个更慢的应用程序仅仅因为代码被混淆了,但是您将拥有一个更难以通过代码遵循逻辑的代码,因此攻击者在代码周围寻找要挂钩的检测框架将有一个更耗时的任务,而不是有时称之为令人沮丧。
保护移动应用程序中的机密
我阅读了不同的文章,但没有找到正确保护这些数据的方法。来自 APK 的简单还原工程显示秘密数据。
是的,你找不到一个,因为这不是一个要解决的小问题,你只能让它变得困难,但并非不可能。
访问 API 服务器的对象和对象的区别
在深入探讨解决您的问题的可能方法之前,我想先澄清一个误解,这种误解通常在任何资历的开发人员中发现,即关于 谁 和 之间的区别什么正在访问 API 服务器。
我写了一系列关于 API 和移动安全的文章,在文章 Why Does Your Mobile App Need An Api Key? 你可以详细阅读 谁 和 what 访问你的API 服务器,但我将在这里提取它的主要内容:
what 是向 API 服务器发出请求的事物。它真的是您的移动应用程序的真实实例,还是机器人、自动脚本或攻击者使用 Postman 之类的工具手动绕过您的 API 服务器?
谁是移动应用的用户,我们可以通过多种方式进行身份验证、授权和识别,例如使用 OpenID Connect 或 OAUTH2 流。
因此,将 谁 视为您的 API 服务器将能够对数据进行身份验证和授权访问的用户,并将 what 视为制作该数据的软件代表用户请求。
现在您可以更好地了解它们之间的区别,您可以在决定为您的用例采用何种方法时,在安全性和权衡方面做出更明智的决定。
一种可能的幼稚方法
隐藏您的 API 密钥,或者如果您更喜欢本机 C 代码中的 KeyCloak 密钥,正如我在上面链接的文章中显示的那样,该文章引用了此 Github repo。这使得静态逆向工程的秘密变得更加困难。 按照 Google 的说明缩减代码和资源、混淆和优化您的应用程序。这使得很难找到用于挂钩 Frida 的代码。 实施证书固定。这使得执行中间人攻击变得更加困难。我称之为幼稚的方法,因为我在我链接的系列文章中表明它可以被绕过,但它提高了技能集和完成它所需的时间。
可能更好的解决方案
因此,您的主要目标似乎是保护 API 密钥,您需要将其用作通过后端 API 服务器识别您的移动应用程序的一种方式,也就是使用正版和未篡改版本锁定后端 API 服务器您的移动应用程序,这将允许服务器仅响应来自您上传到 Google Play 商店的相同二进制文件的请求,那么您可能需要查看移动应用程序证明概念,为此我建议您阅读this answer 我提出的问题是如何保护移动应用程序的 API REST?,尤其是保护 API 服务器和可能更好的解决方案部分.
简而言之,移动应用证明解决方案的作用是在运行时保证您的移动应用没有被篡改,没有在有根设备中运行,没有被 xPosed 或 Frida 等框架检测,而不是受到中间人攻击,这是通过在后台运行 SDK 来实现的。在云中运行的服务将挑战应用程序,并根据响应证明移动应用程序和设备正在运行的完整性,因此 SDK 永远不会对任何决定负责。
你想加倍努力吗?
在回答安全问题时,我总是喜欢参考 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) 是一本用于移动应用安全开发、测试和逆向工程的综合手册。
【讨论】:
以上是关于react-native 应用程序中如何保护敏感数据的主要内容,如果未能解决你的问题,请参考以下文章
由于谷歌播放控制台的新政策,React-native Android 应用程序不断拒绝:敏感信息