返回博客首页
← 所有文章

保护您的移动应用 - 第三集(传输中数据的安全)

2019年1月16日 — 作者:Rob Lauer

无论您是在开发传统的原生应用、使用 Appcelerator 或 Xamarin 跨编译的应用、使用 Ionic 的混合应用,还是使用 NativeScript 或 React Native 的 JavaScript 原生应用,每个应用都存在一个共同点:应用安全。

上次,我们探讨了如何保护存储在设备上的数据 - 无论是通过加密的键值存储、SQLite + SQLCipher,还是像Progress Kinvey这样的健壮且合规的后端用于加密和在线/离线数据同步。

观看网络研讨会"保护移动应用的最佳实践",获取一些关于 NativeScript 安全性的提示和技巧!

在数据在您的后端之间来回传输时保持应用数据完整性是这个难题的另一个关键部分,因此,今天我们将重点关注如何在传输过程中保护和确保数据安全。

查看来自NativeScripting.com 的关于移动应用安全的新课程,使用代码:NSSECURE 可享受 30% 的折扣。

SSL/TLS 无处不在

encrypt all the things

iOS

随着 iOS 9 的推出,应用传输安全 (ATS) 成为了一个默认功能,它增强了 iOS 应用中的安全性。当您的 iOS 应用进行外部连接时,该连接**必须**满足以下要求

  • 服务器必须至少支持传输层安全 (TLS) 协议版本 1.2;
  • 连接密码仅限于提供前向保密性的密码;
  • 证书必须使用 SHA256(或更高版本)签名哈希算法进行签名;
  • 无效证书会导致硬故障且无法连接。

这对开发人员来说非常棒,因为默认情况下,我们被迫让 iOS 应用通过安全通道进行通信。但是,仍然有一种方法可以规避这一点,我在这里指出这一点,作为您**不应**添加到您的 info.plist 中的内容。

⚠️ 反模式警告!⚠️

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

NSAllowsArbitraryLoads 设置为 true 允许加载**任何**远程资源,而不管传输协议的安全性如何。再次强调,请不要这样做。😀

Android

最新版本的 Android(9.0,也称为 Pie)落后于 Apple,但默认情况下会阻止应用中的 HTTP 流量。

此要求将适用于所有以 Android 9 为目标的应用,但是,与 iOS 一样,如果需要通过网络安全配置选项进行任何不安全的 HTTP 连接,则需要在应用的 network_security_config.xml 文件中进行特定声明。与 iOS 一样,请不要这样做 😀

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

因此,今天的规则 #1,也是最简单的规则,就是确保您进行的每次远程调用(无论它是对图像还是远程端点的调用)都通过 TLS 进行。

防止中间人攻击

在传输数据时利用 SSL/TLS 至关重要,但仅仅访问 https 端点并不一定能保证安全。这就是可怕的“中间人”攻击发挥作用的地方。

中间人攻击是指某人秘密且透明地中继并可能更改两个相信他们直接相互通信的参与方之间的通信的情况。

man-in-the-middle attack

显然,当我们谈论确保传输中数据的完整性时,这是一个重大问题 - 解决方案是使用一个称为 SSL 固定(SSL Pinning)的概念。

SSL 固定是指针对已知证书副本验证服务器证书的行为。通过将服务器的 SSL 证书捆绑到您的应用中,并确保任何请求都验证服务器的证书是否与与应用一起存储的证书匹配。

幸运的是,有一个 NativeScript 插件可以解决这种情况!nativescript-https 插件是http 模块的直接替换。

要使用此插件启用 SSL 固定,您需要安装 SSL 证书并在代码中启用固定

import { knownFolders } from 'file-system'
import * as Https from 'nativescript-https'
let dir = knownFolders.currentApp().getFolder('certs')
let certificate = dir.getFile('wegossipapp.com.cer').path
Https.enableSSLPinning({ host: 'wegossipapp.com', certificate })

端到端加密

显然,保护从设备到后端的数据的最佳解决方案是完全集成的解决方案。再次强调,Progress Kinvey 应运而生。

progress kinvey logo

上一篇文章中所述,凭借功能齐全的NativeScript SDK,Kinvey 可以加密设备上的静止数据、保护传输中数据的完整性,以及保护云中的数据安全!

最后但并非最不重要的是第四集:安全的身份管理

本系列的最后一篇文章重点介绍了一个非常常见的应用场景:使用现有的 OAuth 提供商和生物识别安全选项安全地验证和授权用户!