作者:米蘭王妃级_608 | 来源:互联网 | 2022-12-14 13:23
我正在开发用于iOS的移动应用程序,该应用程序必须安全地存储数据并能够在后台模式下从蓝牙设备下载数据。
我想知道加密该数据的最佳方法是什么?我正在考虑使用数据保护,并添加适当的文件属性以强制加密,或者通过将密码哈希存储在钥匙串中并使用带有基于该哈希的派生密钥的AES加密文件来更手动地进行加密。
但是,我有点担心钥匙串访问标志,就我而言,我将不得不使用kSecAttrAccessibleAfterFirstUnlock。谁能解释这到底是什么意思?
总结一下我的担忧:
可以在后台模式下提供良好的安全性吗?
最好的方法是什么?
kSecAttrAccessibleAfterFirstUnlock-是否表示用户在重启后解锁设备时我的数据不安全?
如果用户没有密码怎么办?数据安全与否?
预先感谢您对本主题的任何帮助。
1> Wojciech Kul..:
我设法进行了更多研究,并决定根据Apple的文档iOS 11的iOS安全分享我的结论。
以下所有内容都是基于文档中的知识以及我的个人解释。因此,在将其应用于您的解决方案之前,请仔细阅读文档。
文件始终在闪存(本地存储)上加密
首先,据我了解的阅读文档,本地存储中的文件永远不会解密(即使没有任何其他保护集)。
如果未为文件分配数据保护类,则它仍以加密形式存储(iOS设备上的所有数据也是如此)。
但是,启用数据保护后,我们将获得更高级别的保护,该级别将为受保护的文件生成加密密钥。但是,无论我们选择哪种保护级别,文件都将始终在本地存储上保持加密状态。
我们如何在应用程序中获取解密数据如何工作?
每台iOS设备都有专用的AES-256加密引擎,该引擎内置在闪存和主系统内存之间的DMA路径中,从而使文件加密非常高效。
打开文件时,将使用文件系统密钥解密其元数据,从而显示包装的每个文件密钥以及用于保护该文件的类的表示法。每个文件(或每个扩展)密钥都用类密钥解包,然后提供给硬件AES引擎,该引擎会对从闪存中读取的文件进行解密。所有包装的文件密钥处理都在Secure Enclave中进行;文件密钥永远不会直接暴露给应用程序处理器。
因此,所有解密都是“即时”发生的,文件仍受闪存保护。
NSFileProtectionCompleteUntilFirstUserAuthentication
我不会详细介绍每个防护等级,但是我想澄清一下。如上所述,文件始终受到保护,因此,如果我们使用类NSFileProtectionCompleteUntilFirstUserAuthentication会发生什么?答案在这里:
此类的行为与完全保护相同,只是在锁定设备时不会从内存中删除解密的类密钥。
只有我们的应用程序可以访问文件,但是加密设备可以在这里完成工作,即使设备被锁定并从闪存到系统内存解密数据,也可以访问内存中的文件密钥。
硬件安全
值得一提的是,硬件也受到保护,即使将闪存存储移至另一台设备,也无法获取其数据。
UID允许将数据以密码方式绑定到特定设备。例如,保护文件系统的密钥层次结构包括UID,因此,如果将存储芯片从一台设备物理移动到另一台设备,则文件不可访问。UID与设备上的任何其他标识符无关。
越狱问题
越狱后数据仍然安全吗?
幸运的是,数据保护机制使用密码来解密数据,因此,即使越狱了您的设备,数据也将保持加密状态,除非黑客破解了您的密码。
后台模式
对于使用后台模式的应用程序,NSFileProtectionCompleteUntilFirstUserAuthentication应该足够了。苹果在与KeyChain访问相关的部分中提到了这一点(这非常相似):
利用后台刷新服务的应用程序可以对需要在后台更新期间访问的钥匙串项目使用kSecAttrAccessibleAfterFirstUnlock。