代码之家  ›  专栏  ›  技术社区  ›  Wojciech Kulik

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

  •  1
  • Wojciech Kulik  · 技术社区  · 7 年前

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

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

    但是,我有点担心密钥链访问标志,在我的情况下,我必须使用 kSecAttrAccessibleAfterFirstUnlock . 有人能解释一下这到底是什么意思吗?

    总结一下我的担忧:

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

    提前感谢您对本主题的帮助。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Wojciech Kulik    7 年前

    我设法做了更多的研究,并决定分享我的结论,基于苹果的文件 iOS Security for iOS 11 .

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


    文件总是在闪存上加密(本地存储)

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

    如果一个文件没有分配数据保护类,它仍然是 以加密形式存储(与ios设备上的所有数据一样)。

    但是,启用数据保护后,我们将获得一个更高级别的保护,它将为受保护的文件生成加密密钥。但不管我们选择哪种保护级别,文件都会在本地存储中一直保持加密状态。

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

    每个ios设备都有一个内置在 在闪存和主系统存储器之间的dma路径,使得 文件加密高效。

    当一个文件被打开时,它的元数据被文件系统解密 键,显示包装的每个文件键以及在哪个类上的符号 保护它。程序文件(或每个数据块)密钥与类一起展开 密钥,然后提供给硬件aes引擎,该引擎解密文件 因为它是从闪存读取的。发生所有包装的文件密钥处理 在安全的飞地中,文件密钥从不直接暴露给 应用处理器。

    因此,所有解密都是“动态”进行的,文件仍在闪存上受到保护。

    NSFileProtectionCompleteUntilfirstuSerAuthentication

    我不打算详细介绍每一个防护等级,但我想澄清这一点。如前所述,文件一直受到保护,那么如果我们使用类nsfileprotectioncompleteuntilfirstususerauthentication会发生什么?答案如下:

    这个类的行为方式与完全保护相同,只是当设备被锁定时,解密的类密钥不会从内存中删除。

    只有我们的应用程序可以访问该文件,但这里的工作是通过加密引擎完成的,加密引擎可以访问 文件键 在存储器中,即使设备被锁定并将数据从闪存解密到系统存储器。

    硬件安全

    值得一提的是,硬件也是受保护的,即使你把闪存移到另一个设备上,也不可能得到它的数据。

    uid允许数据以加密方式绑定到特定设备。 例如,保护文件系统的密钥层次结构包括 uid,所以如果内存芯片从一个设备物理地移动到 另外,文件是不可访问的。uid与任何其他 设备上的标识符。

    越狱问题

    越狱后数据安全吗?

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

    背景模式

    对于使用后台模式的应用程序 NSFileProtectionCompleteUntilfirstuSerAuthentication 应该够了。苹果在与密钥链访问相关的章节中提到(非常类似):

    利用后台刷新服务的应用程序可以使用 ksecattraccessibleaafterfirstunlock用于需要 在后台更新期间访问。