返回博客首页
← 所有帖子

NativeScript 的安全性如何?

2016 年 11 月 22 日 — 作者:Valio Stoychev

观看网络研讨会"保护移动应用程序的最佳实践",获取有关 NativeScript 安全性的提示和技巧!
社区经常问的一个问题是,与原生 iOS 和 Android 框架相比,NativeScript 作为框架的安全性如何。通常情况下,人们对原生框架如何保护应用程序以及 JavaScript 的使用如何影响应用程序的“安全性”缺乏了解。

所以让我们来解决这个问题!我将概述原生应用程序如何保护代码和数据以及 NativeScript 如何做到这一点。

移动安全是一个非常广泛的主题,因此我不会在这里详细介绍。我将尝试解释 NativeScript 如何重用原生平台中已完成的工作。如果你有兴趣了解更多关于移动安全的信息,我可以建议你首先阅读这些白皮书
我们在 NativeScript 中所做的是使用 iOS 和 Android 中已实现的最佳实践来保护数据和代码。

它实际上就是保护应用程序代码和保护应用程序使用和存储在设备上的数据。让我们从数据部分开始。


保护数据

公司和开发人员通常担心保护敏感数据。当然,这里的一条经验法则是不要将任何敏感数据存储在设备上。

在 NativeScript 中,我们完全使用原生 API 来
  • 获取数据,

  • 将数据存储在设备上

这意味着我们使用底层的原生连接 API 从你的服务器获取数据。就像在原生应用程序中一样,你可以使用 HTTPS/SSL 端点。你还可以使用 Wi-Fi 和 VPN。

iOS 和 Android 提供了一组供应用程序使用的加密 API。这些 API 包括对标准和常用加密原语的实现,例如高级加密标准 (AES)、Rivest-Shamir-Adleman (RSA)、数字签名算法 (DSA) 和安全哈希算法 (SHA)。此外,还提供了针对更高级协议的 API,例如安全套接字层 (SSL) 和 HTTPS。要了解更多信息,请访问以下链接 - iOS KeychainAndroid KeyStore.


要在设备上存储简单的键值数据,你可以访问原生框架中提供的完整 API。NativeScript 中的 SecureStorage 插件为你提供了使用这些 API 的跨平台方式。


SQLCipherImage

对于不是简单键值对的更大数据集,你需要一个可查询的数据存储。对于这种情况,一个非常流行的解决方案是 SQLCipher 数据库。SQLCipher 是一个 SQLite 扩展,它提供了数据库文件的透明 256 位 AES 加密。在写入磁盘之前,页面会被加密,并在读取时解密。由于占用空间小且性能出色,它非常适合保护嵌入式应用程序数据库,并且非常适合移动开发。


如你所见,在保护设备上的数据方面,NativeScript 与原生应用程序框架之间没有区别。你使用 NativeScript 的数据与原生应用程序一样安全,因为你可以使用相同的机制和库来保护它。

现在让我们看看保护应用程序代码有哪些选择。


保护代码

最近的一项调查 中,大约 80% 的 NativeScript 开发人员表示他们希望保护他们的代码。

从公共 iOS 和 Android 市场下载发布的应用程序包非常简单。在这种情况下,任何人都可以打开应用程序包并检查其中的所有资产 - 代码、图像,任何属于包的一部分的内容。这与发布的网站非常相似,其中客户端的源代码对所有人可见。

这对原生 iOS 和 Android 应用程序来说是正确的。一旦应用程序包被下载,应用程序的源代码就可以被看到。我不会详细介绍如何查看应用程序的源代码,但有足够多的免费工具可以逆向工程并显示代码。由于 Java 和 Objective-C 代码的编译方式存在巨大差异,因此该过程对于 iOS 和 Android 是不同的。

现在要明确的一点是,没有 100% 有保证的解决方案可以保护你正在发布的代码。如果它被执行,它就可以被反编译。
考虑到以上情况,代码保护就是通过在普通源代码之上添加额外的安全层来设置反向工程的最高障碍。当应用程序在 Release 模式下构建时,会添加这些工具和层。

在 Android 中,很容易读取应用程序代码。Java 应用程序被编译为在 字节码 上运行的 虚拟机 (JVM)。下载 APK 的每个人都可以使用专用反编译器读取其中的代码。

在 iOS 中,阅读代码更难,这个过程稍微复杂一些,但仍然不是不可能。


在 Android 中,额外的安全层由名为 ProGuard 的工具提供。ProGuard 是 Android Studio 的一部分,可以混淆你使用的 Java 代码,使其更难以反向工程,但仍然不是不可能。


在 NativeScript 中,我们使用 JavaScript 作为应用程序语言。由于 JavaScript 是一种解释型语言,因此它在构建过程中不会编译,并且这些文件作为应用程序包的一部分提供。

一般来说,你不应该从服务器下载代码并执行它,因为这很容易成为安全漏洞。

在 NativeScript 中你可以做些什么来保护代码?


混淆

你有几种选择 - 与原生开发者会做的事情非常相似。你可以使用混淆工具 - 比如 UglifyJS 或类似的工具,在你在 Release 模式下构建时混淆代码。这将使代码保护与使用 ProGuard 工具为 Android 实现的保护相当。混淆工具不仅使代码不可读,而且其中一些工具还会删除不必要的代码并对其进行混淆,使其更小。将此与 WebPack 结合使用,你实际上可以优化 NativeScript 应用程序的大小和加载时间。

上述场景最常用于保护和优化在 Web 上运行的代码的网页。


如果你实现了上述技术,你将实现与 Web 和 Android 原生应用程序中相同的保护级别。


代码加密

我们可以在 NativeScript 中实现的下一级保护是代码加密。我们已经看到,现在可以使用原生解决方案来加密数据。

对于代码加密,这是可以对混淆后的代码或普通代码进行操作的额外保护级别。这里有各种技术可以实现,并提供更强大的代码保护解决方案。再次记住 - 不是牢不可破的,而只是一层额外的保护,可以让窃取你的代码变得更加困难。

我们已经有一个针对代码加密的 POC 解决方案,在下一篇博客文章中,我将深入研究我们正在实验的状态。我们正在寻求社区的意见,以便我们能够使此功能完善。如果你有兴趣今天试用加密插件的 POC,请给我发邮件 ([email protected])

为了完全透明,我们将发布源代码,从而使更广泛的社区能够发现任何缺陷并为使 NativeScript 成为更安全的移动平台做出贡献。


防止未经授权的应用程序包或代码修改的保护

作为 NativeScript 中的额外保护,可以在你的应用程序中添加逻辑,以防止你的移动应用程序执行,如果框架检测到你的应用程序的一部分已被攻击者破坏或修改。想象一下,攻击者下载你的应用程序包并插入代码来绕过身份验证或任何其他逻辑。如果发生这种情况,攻击者可以在已获得 root 权限的设备上运行修改后的应用程序以查找/下载敏感的个人或公司数据。

我们正在考虑在 NativeScript 中实现一个未经授权的应用程序修改功能。为了获得最佳实现,我们希望征求你的反馈。

记住 - 没有什么保护是牢不可破的。将敏感代码保存在服务器上,而不是下载到客户端或公开的包中,例如移动应用程序,这是一个很好的做法。对于原生应用程序和 NativeScript 应用程序来说,这条建议都是正确的做法。

MatrixImage

我们对任何有关此问题的评论都持开放态度。请在下方写下你的反馈。如果你想私下聊天,让我们这样做.