iOS 沙盒 - 保护 Documents 目录中的数据

Posted

技术标签:

【中文标题】iOS 沙盒 - 保护 Documents 目录中的数据【英文标题】:iOS Sandbox - Securing the data in Documents directory 【发布时间】:2014-01-09 07:37:49 【问题描述】:

我想下载一些文件并将其存储在沙盒中。但是,它们必须始终保持安全(即加密)。现在,我可以在下载到文档本身时对其进行加密。但是当需要使用文件时,我必须在此之前解密它们。问题是把这些解密的文件放在哪里?

tmp - 看起来是一个保存它的好地方,但是如果应用程序被最小化了几天后内容被删除了怎么办。

文档 - 将解密的文件保存在单独的位置可能不是一个好主意。重新启动应用程序时不会自动清理它,如果在应用程序仍在运行时设备电量耗尽,这些解密的文件将被暴露。

因此,有争议的问题是确保 Documents 目录数据安全的最佳方法。

【问题讨论】:

你真的不想要一个解密的文件,因为它破坏了保护点。你真的只是想将数据读入内存... 那会怎样。假设我在沙箱的 Documents 目录中有一个加密的 mp4 文件。现在,当我想使用 MPMoviePlayerController 播放这个本地加密的 mp4 文件时,该怎么做。 我并没有说它总是可能的(或容易的)。只是你应该知道你正在尝试做的事情的安全隐患。你不能让它 100% 安全。 我只是想知道可以实现的最大安全性是多少 :) 你说它应该在内存中让我很感兴趣,这让我觉得你暗示了一些我可能不会有想过。因此,让我这样说吧,在这种情况下,您将如何确保最佳的安全性。 “将数据读入内存”究竟是什么意思? 【参考方案1】:

基于 UNIX 的系统的一个有用方面是您可以创建/打开一个文件,然后立即删除该文件。该文件将无法从应用程序外部访问,但该应用程序将能够读取/写入数据到该文件,并且在文件句柄关闭之前不会真正删除该文件。

这意味着您可以在应用程序可访问的文件结构中的任何位置创建/打开解密文件。

虽然我还没有在 ios 下测试过,但我认为它很有可能会起作用。

【讨论】:

但内容仍在未加密的磁盘上,供其他越狱应用查找。 是的。它甚至不需要越狱设备来访问它们。 @Zaph 另一个进程如何访问目录中没有条目的文件? 在越狱设备上,直接读取设备 (/dev)。这完全取决于数据对攻击者的价值。出于同样的原因,有必要在关闭时覆盖文件。 @Zaph - 您可能想对原始问题给出任何答案吗?【参考方案2】:

我会将加密文件保存在 Documents 目录中,使用 NSData NSDataWritingFileProtectionComplete 选项加密。

如果您觉得需要自己加密文件,然后仅在需要时解密,请将解密后的文件保存在 Documents 目录中,并使用 NSData NSDataWritingFileProtectionComplete 加密。将“不备份”扩展属性添加到文件中。在应用程序启动/唤醒等时,根据警察覆盖不再需要的文件并删除。使用带有随机 iv、随机密钥的 AES、CBC 模式并将密钥保存在 Keychain 中。

如果这适用于您的应用,则可以作为流打开并动态解密到缓冲区中的选项。

但问题是我真的不了解您的完整用例。最佳实践:聘请 iOS 安全领域专家来建议和审查您的解决方案,我愿意。安全是否值得这个价格,一个有效的问题。

向我的 cmets 解释:我编写了一个应用程序来从损坏的 HD 中恢复图像,并不是那么难。

【讨论】:

以上是关于iOS 沙盒 - 保护 Documents 目录中的数据的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发之--沙盒的操作

IOS沙盒Files目录说明和常用操作

iOS开发之获取沙盒路径

理解 iOS沙盒(sandbox)机制

iOS沙盒文件夹及获取路劲方法

IOS开发-UI学习-沙盒机制&文件操作