从 Core Data 中删除和添加存储

Posted

技术标签:

【中文标题】从 Core Data 中删除和添加存储【英文标题】:Remove and add store from Core Data 【发布时间】:2013-02-02 18:32:29 【问题描述】:

我在 Core Data 中存储了一些敏感信息,例如密码等。我希望我的应用程序在应用程序进入后台或终止时加密整个 SQLite 数据库(它不是很大,

当我的应用程序终止/进入后台时,我现在这样做:

保存上下文 从协调器中删除存储 加密存储并保存 删除商店

当我的应用返回时,我会执行以下操作:

解密并保存存储文件 将商店添加回协调器 重置上下文

根据我从文档中了解到的情况,这应该足够了,但它不起作用,一旦主视图控制器尝试再次获取上下文,我的应用程序就会崩溃。

有人知道从核心数据中暂时删除商店然后再次添加它的最佳方法是什么?

【问题讨论】:

您能否使用 ios 的内置数据保护权利来保护您应用的数据?不过,这取决于用户是否有密码。 从 iOS 5 开始,核心数据存储已经加密,直到用户首次输入密码。如果这还不够,您可以在设备被锁定时请求系统对其进行加密,方法是在创建持久存储时为选项字典中的 NSPersistentStoreFileProtectionKey 传递不同的值。 我知道硬件加密。问题是,我正在谈论的数据库文件也可以通过 iTunes 访问,因此用户可以备份该文件。而且这个文件不会被加密,所以我需要在设备上加密它。 即使根本不谈论加密。当应用程序进入后台时,我不应该以某种方式正确保存和“释放”商店吗?还是我只是保存上下文并保持原样? 【参考方案1】:

这不是您问题的答案,但值得一说:

您的加密策略存在致命缺陷,我强烈建议您想出一个不同的方案。

如果数据应该在磁盘上加密,并且实际上值得加密,则永远不应该以未加密状态将其写入磁盘,原因如下:

如果应用程序强制退出,或设备断电,文件在磁盘上仍保持未加密状态。然后有人可以在磁盘上四处寻找未加密的数据。

删除存储文件的普通版本很可能不是安全删除文件,因此磁盘分析/工具可以找到未加密版本的文件。

如果您想在数据写入磁盘时对其进行加密,则必须每次都将加密数据写入磁盘,无一例外。 “它有时会被加密”是没有用的。

作为替代策略,您可能需要考虑对存储在核心数据本身中的数据进行加密。例如,您可以 NSArchive 您的数据并在将生成的数据字节存储为 BLOB 之前对其进行加密。

【讨论】:

感谢您的回答,但我可以向您保证,这不是我对加密所做的。我的问题实际上只是关于在应用程序进入后台时如何正确“关闭”Core Data 存储,以及在应用程序恢复时如何再次重新打开存储。在这种情况下是否有必要“关闭”商店或托管对象上下文,或者我可以在应用程序进入后台时将所有内容保持原样? 哦,我明白了,你的意思是你有一个内存存储,你稍后会在写入磁盘之前对其进行加密?

以上是关于从 Core Data 中删除和添加存储的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序从 4.0 中的任务列表中删除时,Core Data 存储消失

Core Data 删除外部存储实体不会释放 iCloud 中的空间

RestKit / Core Data:远程删除的实体不会从 Core Data 中删除

Core Data:如何删除和重建数据存储?

从内存的角度来看,具有非持久存储的 NSArray 和 Core Data 是如何工作的?

如何删除 Core Data 存储中除一个对象之外的所有对象?