React Native中最安全的密钥存储方式是什么

时间:2019-04-25 19:15:49

标签: node.js react-native security

谢谢您的帮助。

我正在使用React Native和Node.js为我的公司交付产品。

我已经在后端设置了步骤来检索密码,对其进行验证并使用令牌进行响应。唯一的问题是-我在前端(移动应用程序)上使用的要由后端验证的密码是硬编码的。

我的问题是:

我应该如何安全地将该密码存储在移动应用程序上,以使它不会被黑客窃取并用于破坏后端?

到目前为止我的研究。

嵌入在strings.xml中

隐藏在源代码中

隐藏在BuildConfigs中

使用Proguard

伪装/加密的字符串

隐藏在本地库中

http://rammic.github.io/2015/07/28/hiding-secrets-in-android-apps/

这些方法基本上没有用,因为黑客可以轻松绕开这些保护方法。

https://github.com/oblador/react-native-keychain

尽管这可能会混淆密钥,但仍必须对其进行硬编码。除非我错过了一些东西,否则这些都将变得无用。

我可以使用.env文件 https://github.com/luggit/react-native-config

再次,我觉得黑客仍然可以查看秘密密钥,即使它们已保存在.env

我希望能够在应用程序中存储密钥,以便可以验证用户并允许他们访问后端的资源。但是,我不知道最好的行动计划是确保用户/企业安全。

当他们窃取密钥并不恰当地使用它们时,您有什么建议来保护整个世界(本地应用程序)免受讨厌的黑客攻击?

1 个答案:

答案 0 :(得分:1)

您的问题

  

我已经在后端设置了步骤来检索密码,对其进行验证并使用令牌进行响应。唯一的问题是-我在前端(移动应用程序)上使用的要由后端验证的密码是硬编码的。

     

我的问题是:

     

我应该如何安全地将该密码存储在移动应用程序上,以使它不会被黑客窃取并用于破坏后端?

残酷的事实是……你不能!

您似乎已经对该主题进行了广泛的研究,在我看来,您提到了一种通过嵌入式机密发布应用的有效方法:

  

隐藏在本地库中

但是您也说过:

  

这些方法基本上没有用,因为黑客可以轻松绕开这些保护方法。

有些是无用的,而另一些则使反向工程更难以从移动应用程序中获得秘密。正如我写的here所述,使用本机接口隐藏秘密的方法将需要专门知识来对它进行反向工程,但是,如果很难对二进制文件进行反向工程,您总是可以求助于中间人(MitM )攻击以窃取机密,正如我展示的here一样,它是使用本机接口JNI/NDK来检索隐藏在移动应用程序二进制文件中的机密。

要保护您的移动应用不受MitM的侵害,可以使用Certificate Pinning

  

固定是将主机与其预期的X509证书或公钥关联的过程。一旦知道或看到了主机的证书或公钥,便会将证书或公钥关联或“固定”到主机。如果可以接受多个证书或公钥,则该程序将保留一个密码集(取自Jon Larimer和Kenny Root Google I / O谈话)。在这种情况下,所宣传的身份必须与引脚集中的元素之一匹配。

您可以阅读this series条关于本机的React文章,这些文章向您展示如何应用证书固定来保护移动应用程序与API服务器之间的通信渠道。

如果您还不知道,还可以使用Frida或xPosed之类的工具绕过证书固定。

Frida

  

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

xPosed

  

Xposed是用于模块的框架,可以在不触摸任何APK的情况下更改系统和应用程序的行为。太好了,因为这意味着模块可以用于不同版本甚至ROM,而无需进行任何更改(只要原始代码的更改不太多)。撤消操作也很容易。

所以现在您可能想知道如何保护我免受证书钉扎绕过?

使用移动应用证明解决方案,并非易事,但有可能实现。

在继续进行讨论之前,我想先澄清一下开发人员之间关于 WHO What 正在访问API服务器的普遍误解。

WHO和访问API服务器之间的区别

为了更好地了解 WHO What 在访问API服务器之间的区别,让我们使用以下图片:

Man in the Middle Attack

预期的通信渠道表示合法用户没有任何恶意意图就可以使用您期望的移动应用程序,它使用的是未修改版本的移动应用程序,并且可以直接与API服务器通信,而不会受到中间人的攻击。

实际渠道可能代表几种不同的情况,例如具有恶意意图的合法用户可能正在使用移动应用程序的重新打包版本,黑客使用了移动应用程序的真实版本,而中间人则在进行攻击,了解移动应用程序与API服务器之间的通信是如何进行的,以便能够自动对您的API进行攻击。可能还有许多其他情况,但是我们在这里不逐一列举。

我希望到现在为止您可能已经知道为什么 WHO What 不同的地方,但是如果不一样的话,一会儿就会明白。

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

  

OAUTH

     

通常,OAuth代表资源所有者向客户端提供对服务器资源的“安全委派访问”。它为资源所有者指定了一个在不共享凭据的情况下授权第三方访问其服务器资源的过程。 OAuth专为与超文本传输​​协议(HTTP)配合使用而设计,实质上允许在资源所有者的批准下,授权服务器将访问令牌发布给第三方客户端。然后,第三方使用访问令牌访问资源服务器托管的受保护资源。

     

OpenID Connect

     

OpenID Connect 1.0是OAuth 2.0协议之上的简单身份层。它允许客户端根据授权服务器执行的身份验证来验证最终用户的身份,并以可互操作且类似于REST的方式获取有关最终​​用户的基本配置文件信息。

尽管用户身份验证可能会让API服务器知道 WHO 正在使用API​​,但不能保证请求源自您期望的 What 。移动应用。

现在,我们需要一种方法来识别正在调用的API服务器,这使得事情变得比大多数开发人员想象的要棘手。 内容是向API服务器发出请求的内容。它是移动应用程序的真正实例,还是使用诸如Postman之类的工具通过API服务器手动访问的机器人,自动脚本或攻击者?

让您感到惊讶的是,您可能最终发现它可能是使用重新打包的移动应用程序版本或试图游戏化并利用该应用程序提供的服务的自动脚本的合法用户之一。

好吧,为了确定内容,开发人员倾向于求助于通常会在其移动应用程序代码中进行硬编码的API密钥。一些开发人员花了很多功夫,并在移动应用程序中在运行时计算密钥,因此与将静态机密嵌入代码中的前一种方法相反,它成为了运行时机密。

以上文章摘录自我写的一篇文章,题为《 为什么您的移动应用程序需要API密钥?”,因此您可以完整阅读here,即有关API密钥的系列文章中的第一篇。

移动应用证明

使用移动应用证明解决方案将使API服务器能够知道什么正在发送请求,从而仅响应来自真实移动应用的请求,而拒绝来自不安全应用的所有其他请求来源。

移动应用程序证明服务的作用是在运行时确保您的移动应用程序未被篡改,不在根目录设备中运行以及不成为MitM攻击的目标。这是通过在后台运行SDK来完成的,该SDK将与在云中运行的服务进行通信,以证明移动应用和设备正在运行的完整性。云服务还验证了与API服务器握手时提供给移动应用程序的TLS证书与移动应用程序的原始API服务器和真正的API服务器使用的确实相同,而不是来自MitM攻击的一个。

在成功证明移动应用程序完整性之后,将发布并使用一个秘密的短期生存JWT令牌进行签名,该秘密只有云中的API服务器和移动应用程序证明服务可以识别。如果移动应用程序证明失败,则会使用API​​服务器不知道的秘密对JWT令牌进行签名。

现在,应用程序必须随每个API一起发送,并在请求的标头中调用JWT令牌。这将允许API服务器仅在可以验证JWT令牌中的签名和到期时间时才处理请求,而在验证失败时拒绝它们。

一旦移动应用程序不知道移动应用程序证明服务使用的机密,即使在应用程序被篡改,在有根设备上运行或通过连接进行通信时,也无法在运行时对其进行反向工程成为中间攻击中一名男子的目标。

因此,该解决方案可在没有误报的积极检测模型中工作,从而不会阻止合法用户,同时又将坏人拒之门外。

  

当他们窃取密钥并不恰当地使用它们时,您有什么建议来保护整个世界(本地应用程序)免受讨厌的黑客攻击?

我认为您应该选择使用移动应用程序认证解决方案,如果您拥有专业知识,可以自行使用,或者可以在Approov使用已经作为SAAS解决方案存在的解决方案(我在这里工作),它为多个平台提供了SDK,包括iOS,Android,React Native等。集成还需要在API服务器代码中进行少量检查,以验证由云服务发出的JWT令牌。对于API服务器来说,必须进行此检查才能决定要处理的请求和拒绝的请求。

摘要

  

我希望能够在应用程序中存储密钥,以便可以验证用户并允许他们访问后端的资源。但是,我不知道最好的行动计划是确保用户/企业安全。

请不要沿用将密钥存储在移动应用程序中的方法,因为您已经知道,通过广泛的研究,可以绕过它们。

请与OAUTH2或OpenID connect结合使用移动证明解决方案,您可以将其与移动应用证明令牌绑定。可以在this article中找到此令牌绑定的示例,以检查端点/forms中的自定义有效负载声明。

走多远

OWASP Mobile Security Project - Top 10 risks

  

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