使用iOS中的Core Data保护数据

时间:2014-09-09 14:33:24

标签: ios sqlite core-data encryption data-protection

我有一些关于保护我的应用数据的问题:

1)我需要通过Core Data加密我存储的所有数据,但我没有找到实现这一点的起点。在Core Data Programming Guide他们说:

  

Core Data不保证来自不受信任来源的持久存储的安全性,也无法检测文件是否被恶意修改。 SQLite存储提供比XML和二进制存储稍微更好的安全性,但它不应被视为本身安全。请注意,您还应该考虑商店元数据的安全性,因为元数据中存档的数据可能会独立于商店数据进行篡改。如果要确保数据安全性,则应使用加密磁盘映像等技术。

这并没有让我明白我该做什么......我也看了Security Overview但是这份文件似乎与Core Data无关。但是,他们提到Data Protection来保护文件,但我不确定这是否是我真正想要的...我应该使用Data Protection作为SQLite文件Core Data可以使用?

我需要一些关于如何加密所有Core Data存储数据的指导,请

2)最好将用户密码存储在钥匙串中,而不是使用Core Data加密和存储它们吗?

提前致谢

4 个答案:

答案 0 :(得分:9)

自iOS 5起,Core Data持久存储默认使用Data Protection加密数据。来自iOS 5 release notes

  

对于为iOS 5.0或更高版本构建的应用程序,持久性存储现在默认以加密格式存储数据到磁盘上。在用户首次解锁设备之后,默认保护级别将阻止访问数据。您可以在配置持久性存储时通过为NSPersistentStoreFileProtectionKey键分配自定义值来更改保护级别。有关iOS 5.0中新增的数据保护的其他信息,请参阅“数据保护改进”。

WWDC 2011会议以及#34; Core Data"中的新功能也涵盖了这一点。

作为最佳实践,用户名和密码应存储在钥匙串中。如果要存储远程服务(例如HTTP服务器,FTP服务器等)的用户名和密码,最好通过NSURLCredentialStorage API使用密钥链。

答案 1 :(得分:4)

" encrypted-core-data"项目对平均复杂数据模型有局限性。在我的iOS应用程序中,我们有一些多对多的关系,以及某些实体之间的一对多关系。

桥接代码(将核心数据桥接到SQLCihper的代码)缺乏,例如它没有NSOrderedSet实现。修改桥接代码对我们来说是一项高成本的努力。

因此,我们决定加密列中的敏感数据。因此,我们使用transformable attributes的核心数据本机功能,并使用加密库来加密实体的属性。此功能在数据进入列时对其进行加密,并在读取时对其进行解密。这是自动完成的。

当我们在多个行上查询数据以显示在列表视图中时,这会导致我们遇到性能问题。要解决此问题,我们会将列类型还原为普通string类型,然后在代码中手动执行加密和解密,但仅在需要时进行。我们还在模型中使用transient属性来存储解密的表单。这有助于我们将性能恢复到可接受的水平。

我仍然在寻找一种更好的方法来加密整个数据库,同时使用核心数据。

答案 2 :(得分:2)

你可以使用像encrypted-core-data这样的东西,它是SQLite Cipher的核心数据访问器包装器。

这是NSIncrementalStore的子类,它与加密数据库进行交互。

如果你只是存储密码,那么钥匙串是更好的选择,但如果你想加密核心数据存储,那么上面是更好的选择。

答案 3 :(得分:2)

" 2。将用户密码存储在钥匙串中应该更好吗,而不是使用核心数据加密和存储它们?"

是的,这就是钥匙链的用途。您可以创建比钥匙串更安全的存储空间的机会很小。即使是在越狱" iOS仍然存在无法获得的安全计时,每次访问尝试的最短时间。