在移动 Web 应用程序中存储“应用程序机密”的最佳方式是啥?

Posted

技术标签:

【中文标题】在移动 Web 应用程序中存储“应用程序机密”的最佳方式是啥?【英文标题】:The best way to store "app secret" in a mobile web application?在移动 Web 应用程序中存储“应用程序机密”的最佳方式是什么? 【发布时间】:2018-11-29 10:40:29 【问题描述】:

我想用 javascript 开发一个“响应式移动网络应用程序(ios / android”来与智能合约和区块链交互。

我决定开发一个混合移动网络应用程序。 但是,问题是在使用 JavaScript 开发移动 Web 应用程序时如何安全地存储 App Secret? 因为,我们不想将它存储在移动设备中,并且区块链是因为安全。

【问题讨论】:

【参考方案1】:

我想用 JavaScript 开发一个“响应式移动网络应用程序(iOS / Android)”来与智能合约和区块链交互。

我不清楚您是指将移动应用程序编写为在移动设备中完全响应的网站,还是您正在考虑使用 Ionic、React Native 或其他框架编写它。

据我所知,如果是一个响应式网站,那么一旦没有安全的方法来保护它们的秘密,请忽略我的其余答案。

现在,如果是跨平台移动应用程序与许多可用框架中的任何一个一起完成,那么请继续阅读,因为存在一种可能的解决方案来解决它们上的秘密问题。

但是,问题是在使用 JavaScript 开发移动 Web 应用程序时如何安全地存储 App Secret?

在客户端运行的任何东西都容易受到使用Xposed 或Frida 等工具的逆向工程的攻击。

因此,出于安全考虑,我们不想将其存储在移动设备和区块链中。

正如您已经指出的那样,移动设备或区块链不是存储 App Secret 的好地方。

一个可能的解决方案

要加强您的移动应用程序和 API 服务器之间的通信,您应该使用移动应用程序证明服务,该服务将在运行时保证您的应用程序没有被修改或没有在越狱或 root 设备中运行,通过使用集成在您的应用中的 SDK 和在云中运行的服务。

成功证明应用程序完整性的云服务会发出一个JWT token,该JWT token 使用只有 API 服务器和云服务知道的秘密进行签名,而在失败时,JWT 令牌使用 API 的虚假秘密进行签名服务器不知道。这种方法将允许 API 服务器仅在它可以验证 JWT 令牌中的签名时服务请求,并在验证失败时拒绝它们。

一旦移动应用不知道云认证服务使用的秘密,就不可能在运行时对其进行逆向工程,即使应用被篡改、在有根设备中运行或通过正在成为中间人攻击的目标。

在this article 上,您可以通过示例了解如何使用云中的移动应用证明服务对 React Native 应用进行身份验证。

免责声明:我在 Approov 工作

Xposed

Xposed 是一个模块框架,可以在不触及任何 APK 的情况下改变系统和应用的行为。这很好,因为这意味着模块可以在不同版本甚至 ROM 上工作而无需任何更改(只要原始代码没有太大更改)。它也很容易撤消。由于所有更改都在内存中完成,您只需停用模块并重新启动即可恢复原始系统。还有许多其他优点,但这里只是一个优点:多个模块可以对系统或应用程序的同一部分进行更改。使用修改后的 APK,您可以选择一个。没有办法组合它们,除非作者用不同的组合构建了多个 APK。

Frida

面向开发人员、逆向工程师和安全研究人员的动态检测工具包。

JWT Token

基于令牌的身份验证

JSON Web 令牌是一种开放的行业标准 RFC 7519 方法,用于在两方之间安全地表示声明。

【讨论】:

以上是关于在移动 Web 应用程序中存储“应用程序机密”的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google App Engine 中设置环境变量/应用程序机密

暴露的 Facebook 应用程序机密会导致开发者的 Facebook 帐户被黑客入侵吗?

存储任意排序顺序的最有效方法?

在官方 Meteor for Windows 上创建移动应用程序的最简单方法

在 Java Web 应用程序中从应用程序服务器外部提供静态数据的最简单方法

在基于 Web 的应用程序中,哪里可以正确、安全地存储 JWT 令牌?