如何通过加密保护 Documents 目录中的数据?

Posted

技术标签:

【中文标题】如何通过加密保护 Documents 目录中的数据?【英文标题】:How to protect data in Documents directory with encryption? 【发布时间】:2017-02-18 10:44:31 【问题描述】:

我有一个应用程序可以下载几个 pdf 和图像并将它们保存在 Documents 目录中。我需要每个尝试通过 iExplorer 等工具访问它们的人保护这些文件。我找到了 ios 安全指南并启用了 Data Protection 功能。然后我尝试以这种方式创建一个txt文件:

let documentsPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first!
let filePath = documentsPath + "/hello.txt"

FileManager.default.createFile(atPath: filePath, contents: Data.init(base64Encoded: "HELLOOOOOOOO"), attributes: [kCFURLFileProtectionKey as String: FileProtectionType.complete])

然后,我尝试使用 iExplorer 访问 txt 文件,并且能够像访问任何其他不受保护的文件一样进行访问。我确实让我的 iPhone 解锁并锁定,等待了 5 分钟。这些文件可以毫无问题地访问。我真的需要知道是否有办法让它们无法访问,至少在设备被锁定时是这样。

我正在考虑的另一个解决方案是使用自定义算法加密 Documents 文件夹中的文件,但是这样在大文件的情况下,我们会失去打开文件的速度,因为每次我们需要解密它,这需要取决于文件本身大小的时间量。

建议?

【问题讨论】:

【参考方案1】:

如果要写入解锁后无法访问的文件,则必须编写以下内容:

let filePath = "path/to/place"
let bar = "HII"
let fileAttr = [NSFileProtectionKey : NSFileProtectionComplete]
fileManager.createFile(atPath: filePath, contents: bar, attributes: fileAttr)

解锁后仍然可以访问。如果人们真的想找到这些文件,他们会尝试很多方法来访问它。

注意:此代码未经测试

如果想要有完整的保护,可以用AES加密,需要读取的时候再解密,但是会导致性能损失

【讨论】:

我正在文档目录中创建一个文件夹,然后存储文件。所以我在创建新目录时添加了fileAttr 属性。但是,当我导航到该文件夹​​时,我仍然可以访问这些文档。 let fileAttr = [FileAttributeKey.protectionKey : FileProtectionType.complete] try FileManager.default.createDirectory(atPath: dirPath.path, withIntermediateDirectories: true, attributes: fileAttr)

以上是关于如何通过加密保护 Documents 目录中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何解除文件夹加密

iPhone 中的数据保护 API 未加密

如何将 SQLite 文件从 Documents 目录保存回目标 C 中的主包?

我应该如何保护 iOS 中的 SQLite 数据库?

企业该如何选择数据加密软件?

Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护