关于我的应用程序的数据保护,我有几个问题:
1) 我需要通过Core Data
加密我存储的所有数据,但我找不到实现这一点的起点。在核心数据编程指南中,他们说:
核心数据无法保证来自不可信来源的持久存储的安全性,也无法检测文件是否被恶意修改。SQLite存储提供了比XML和二进制存储稍好的安全性,但不应认为它本质上是安全的。请注意,您还应该考虑存储元数据的安全性,因为元数据中存档的数据可能会被篡改,而与存储数据无关。如果您想确保数据安全,您应该使用加密磁盘映像等技术。
这并不能让我清楚地知道我应该做什么…我还看了一下安全概述,但这份文档似乎不涉及Core Data
。然而,他们提到Data Protection
来保护文件,但我不确定这是否是我真正想要的。。。我应该将Data Protection
用于Core Data
使用的SQLite
文件吗?
我需要一些关于如何加密所有Core Data
存储数据的指导,请
2) 是否应该将用户的密码存储在密钥链中,而不是使用Core Data
加密并存储?
提前感谢
自iOS 5以来,核心数据持久存储默认使用数据保护来加密数据。来自iOS 5发布说明:
对于为iOS 5.0或更高版本构建的应用程序,永久存储现在默认情况下以加密格式在磁盘上存储数据。默认保护级别阻止访问数据,直到用户首次解锁设备。配置永久存储时,可以通过为NSPersistentStoreFileProtectionKey密钥分配自定义值来更改保护级别。有关iOS 5.0中新增的数据保护的更多信息,请参阅"数据保护改进"
WWDC 2011年会议"核心数据的新增功能"也对此进行了介绍。
作为最佳实践,用户名和密码应存储在钥匙链中。如果要存储远程服务(如HTTP服务器、FTP服务器等)的用户名和密码,最好通过NSURLCredentialStorage API使用密钥链。
"加密核心数据"项目对平均到复杂的数据模型有限制。在我的iOS应用程序中,我们有一些多对多关系,以及某些实体之间的一些一对多关系。
桥接代码(将核心数据桥接到SQLCihper的代码)缺少NSOrderedSet
实现。修改网桥代码对我们来说是一项高成本的工作
因此,我们决定对列中的敏感数据进行加密。因此,我们使用了transformable attributes
的核心数据原生能力,并使用加密库来加密实体的属性。此功能在数据进入列时对数据进行加密,在读取数据时对其进行解密。这是自动完成的。
当我们查询多行数据以显示在列表视图中时,这会导致性能问题。为了解决这个问题,我们将列类型恢复为正常的string
类型,然后在代码中手动进行加密和解密,但仅在需要时进行。我们还在模型中使用瞬态属性来存储解密后的表单。这有助于我们将性能恢复到可接受的水平。
我仍在寻找一种更好的方法来加密整个数据库,同时使用核心数据。
您可以使用类似加密核心数据的东西,它是围绕SQLite密码的核心数据访问器包装器。
这是NSIncrementalStore
的一个子类,它与加密数据库交互。
如果你只是存储密码,那么钥匙链是一个更好的选择,但如果你想加密核心数据存储,那么以上是更好的选择。
"2。是否应该将用户的密码存储在密钥链中,而不是使用核心数据加密和存储?"
是的,这就是钥匙扣的作用。创建一个比钥匙链更安全的存储空间的可能性微乎其微。即使在"越狱"iOS的情况下,仍有无法绕过的安全时间,即每次访问的最短时间。