如何保护 iOS 应用程序?

这是移动时代,如今几乎所有事情都可以通过我们的智能手机发生。感谢数以百万计的应用程序帮助我们完成我们想要的任何事情。无论是维护您的日程安排(日历)还是在旅途中管理财务信息,所有事情都可以通过我们智能手机上运行的移动应用程序来完成。由于这些应用程序可以访问如此多的机密信息,因此作为开发人员,当我们制作应用程序时,我们需要遵循最高安全标准,以便无权访问信息的人不会访问这些信息。 

在 iOS 设备方面,每天有超过 10 亿台活跃设备在使用 iOS 应用程序。在这里,我正在编译 iOS 开发人员在开发应用程序时应始终牢记的不同安全实践。

1. 在移动应用中启用 ATS 

随着 iOS 9 和 ELCapitan 的推出,Apple 推出了 ATS(Apple Transport Security),它强制应用程序仅连接到安全网络。这意味着应用程序与外界建立的任何连接都必须使用 HTTPS 协议和 TLS1.2。 

换句话说,ATS 强制应用只进行安全连接,而不使用 HTTP。如果需要,可以通过在 plist 中显式输入来显式提及异常。

2. SSL 证书固定

这种技术对于应对 MITM(中间人)攻击非常有效。SSL 在“信任链”的基础上工作。当应用程序/客户端连接到服务器时,客户端会检查接收到的服务器的 SSL 证书是否受到任何 SSL 证书颁发机构的信任。 

这确保应用程序只与指定的服务器通信。App/Client 将指定服务器的 SSL 证书捆绑在一起,使其能够匹配连接服务器时收到的 SSL 证书和本地证书。这方面的细节需要单独写一篇文章。请继续关注,因为我将在未来写一篇关于这些细节的文章。

3. 将信息存储在 KeyChain 而不是 NSUserDefaults

NSUserDefaults 为我们提供了一种方法来保存需要在应用程序启动和设备重启之间持久保存的少量信息。作为 UserDefaults 的一部分保存的所有信息都保存为 plist 中的纯文本,未加密,任何有权访问设备的人都可以读取。 

如果我们想以加密形式保存信息,我们需要使用 KeyChain,一个用于存储应用程序和安全服务密码的加密容器。Apple 在 Mac OS 和 iOS 中使用相同的密码管理技术。

4. 避免将机密信息作为代码存储库的一部分

任何秘密信息都不应该是 repo/代码库的一部分,而是我们应该使用在构建应用程序时注入的配置文件或环境变量。一个不错的选择是 Xcode 配置文件,它维护与特定目标有关的信息。一个用例是 API 密钥,我们不应该将 API 密钥作为代码库的一部分。我们可以使用包含 API 密钥的配置文件。该文件可以在公司网络内部托管,并且可以在构建应用程序和作为构建过程的一部分注入时读取。

5.越狱检测

黑客很容易在越狱设备上轻松攻破应用程序行为和逻辑。作为开发人员,我们需要确保让黑客尽可能难以获取应用程序的内部详细信息。当我们启动应用程序时,我们绝对应该添加检查越狱设备的逻辑作为第一件事。并在通知用户后,可能会杀死该应用程序。这是实现它的详细文章的链接

6. 仅调试日志

开发人员使用调试消息作为记录应用程序行为的好方法。这在应用程序正在开发中时非常有用。当应用程序正在开发中时,我们倾向于记录一些信息以帮助开发人员构建功能。但是,如果黑客可以访问它,它可能会暴露机密信息和应用程序的内部工作。为了确保我们不会在提交到存储的应用程序版本上记录消息,我们只需执行以下操作,仅在应用程序处于调试模式时进行基本检查以记录日志。 

#if DEBUG
print("log")
#endif

我们可以更进一步,制作一个记录器来处理通过它的每条日志。敬请期待,我将单独写一篇详细的文章来介绍这一点。

7. 第三方库使用

第三方库是避免在我们的移动应用程序中重新创建许多我们想要做的事情的好方法。它们无疑为我们节省了大量时间,同时在使用第三方应用程序时我们需要注意一些事项。这些库总是存在将有害代码注入我们的代码库的风险。在实际集成任何第三方应用程序之前,我们应该始终通过 Github 链接、许可证和代码/安全审查。

8. 文件数据保护

每当我们在我们的应用程序中保存任何文件时,我们应该使用这些选项来保存信息是一种安全的方式

  • 完全保护(NSFileProtectionComplete)
  • 受保护,除非打开 (NSFileProtectionCompleteUnlessOpen)
  • 受保护直到首次用户身份验证 (NSFileProtectionCompleteUntilFirstUserAuthentication)
  • 无保护 (NSFileProtectionNone)

NSFileProtectionNone 最容易使用,但最容易受到安全风险的影响。我们应该始终使用 NSFileProtectionCompleteUnlessOpen 或 NSFileProtectionCompleteUntilFirstUserAuthentication 作为默认文件保护级别选项。

9. 录屏和截屏

许多敏感信息可以通过屏幕录制或屏幕截图从应用程序中暴露出来。此安全检查在银行应用程序中起着非常重要的作用,如果执行屏幕截图或屏幕录制,安全交易细节可能会受到损害。我们可以监听/观察诸如 userDidScreenShotNotification 之类的通知,以便对这些事件采取适当的行动。这是  它的详细实现的链接

结论

作为开发人员,我们应该始终尽量避免数据/信息从我们的应用程序中泄露。我们当然可以通过遵循应用程序安全的标准做法来做到这一点。我通常遵循上面提到的列表,我很想知道您在自己的应用程序中遵循哪些安全最佳实践。请让我知道您的想法,并继续关注未来关于其中一些安全实践的详细文章。

how-to-secure-ios-apps-4a383tmf