当需要后台模式访问时,如何在 iOS 上安全地存储数据?

How to store data securely on iOS when background mode access is required?

我正在为 iOS 开发移动应用程序,它必须安全地存储数据并能够在后台模式下从蓝牙设备下载数据。

我想知道加密数据的最佳方法是什么?我正在考虑使用数据保护并添加适当的文件属性来强制加密,或者通过将密码哈希存储在钥匙串中并使用基于该哈希的派生密钥的 AES 加密文件来更手动地进行加密。

但是,我有点担心钥匙串访问标志,在我的情况下我将不得不使用 kSecAttrAccessibleAfterFirstUnlock。谁能解释一下它到底是什么意思?

总结一下我的担忧:

  1. 是否可以在后台模式下提供良好的安全性?
  2. 最好的方法是什么?
  3. kSecAttrAccessibleAfterFirstUnlock - 这是否意味着当用户在重启后解锁设备时我的数据不安全?
  4. 如果用户没有密码怎么办?数据安全吗?

预先感谢您对此主题的任何帮助。

我设法做了更多的研究,并决定根据 Apple 的文档分享我的结论 iOS Security for iOS 11

以下所有内容均基于文档中的知识和我个人的解释。因此,在将其应用于您的解决方案之前,请仔细阅读文档。


文件始终在闪存(本地存储)上加密

首先,据我阅读文档的理解,本地存储上的文件永远不会被解密(即使没有任何额外的保护设置)。

If a file isn’t assigned a Data Protection class, it is still stored in encrypted form (as is all data on an iOS device).

但是,启用数据保护后,我们获得了更高级别的保护,可以为受保护的文件生成加密密钥。但无论我们选择哪种保护 class,文件在本地存储中都将始终保持加密状态。

我们如何在应用程序中获取解密数据?

Every iOS device has a dedicated AES-256 crypto engine built into the DMA path between the flash storage and main system memory, making file encryption highly efficient.

When a file is opened, its metadata is decrypted with the file system key, revealing the wrapped per-file key and a notation on which class protects it. The per-file (or per-extent) key is unwrapped with the class key, then supplied to the hardware AES engine, which decrypts the file as it is read from flash memory. All wrapped file key handling occurs in the Secure Enclave; the file key is never directly exposed to the application processor.

因此,所有解密都会发生 'on the fly' 并且文件仍然在闪存上受到保护。

NSFileProtectionCompleteUntilFirstUserAuthentication

我不打算详细介绍每种保护措施 class,但我想澄清一下。正如我上面提到的,文件一直受到保护,那么如果我们使用 class NSFileProtectionCompleteUntilFirstUserAuthentication 会发生什么?答案在这里:

This class behaves in the same way as Complete Protection, except that the decrypted class key isn’t removed from memory when the device is locked.

只有我们的应用程序可以访问该文件,但这里的工作是由加密引擎完成的,它可以访问我们内存中的文件密钥,即使设备被锁定和解密也是如此数据从闪存到系统内存。

硬件安全

值得一提的是,硬件也受到保护,即使您将闪存移动到另一台设备,也无法获取其数据。

The UID allows data to be cryptographically tied to a particular device. For example, the key hierarchy protecting the file system includes the UID, so if the memory chips are physically moved from one device to another, the files are inaccessible. The UID isn’t related to any other identifier on the device.

越狱问题

越狱后数据是否仍然安全?

幸运的是,数据保护机制使用密码来解密数据,因此即使在您的设备越狱后数据仍将保持加密状态,除非黑客破解了您的密码。

后台模式

对于使用后台模式的应用程序 NSFileProtectionCompleteUntilFirstUserAuthentication 应该足够了。 Apple 在与 KeyChain 访问相关的部分中提到(非常相似):

Apps that utilize background refresh services can use kSecAttrAccessibleAfterFirstUnlock for Keychain items that need to be accessed during background updates.