11

我有几个关于保护我的应用程序数据的问题:

1) 我需要通过 加密我存储的所有数据Core Data,但我没有找到实现这一目标的起点。在核心数据编程指南中,他们说:

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

这并没有让我清楚我应该做什么......我也看过安全概述但是这个文件似乎没有处理Core Data. 但是,他们提到Data Protection了安全文件,但我不确定这是否是我真正想要的......我应该使用Data Protection适用的SQLite文件Core Data吗?

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

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

提前致谢

4

4 回答 4

9

从 iOS 5 开始,Core Data 持久存储默认使用数据保护来加密数据。从iOS 5 发行说明

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

这也包含在 WWDC 2011 会议“Core Data 中的新功能”中。

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

于 2014-09-09T17:11:41.207 回答
5

加密核心数据”项目对平均到复杂的数据模型有限制。在我的 iOS 应用程序中,我们有一些多对多关系,以及某些实体之间的一些一对多关系。

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

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

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

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

于 2015-03-04T08:47:00.520 回答
2

您可以使用encrypted-core-data 之类的东西,它是围绕 SQLite Cipher 的核心数据访问器包装器。

这是NSIncrementalStore与加密数据库交互的子类。

如果您只是存储密码,那么钥匙串是更好的选择,但如果您想加密 Core Data 存储,那么上面是更好的选择。

于 2014-09-09T14:41:26.213 回答
2

“2.将用户密码存储在钥匙串中,而不是使用Core Data加密和存储它们是否更好?”

是的,这就是钥匙串的用途。您可以创建比钥匙串更安全的存储的机会很小。即使在“越狱”iOS 的情况下,仍然存在无法绕过的安全时间,即每次访问尝试的最短时间。

于 2014-09-09T16:19:26.813 回答