【问题标题】:How to use Data Protection with Core Data?如何将数据保护与核心数据一起使用?
【发布时间】:2015-06-27 02:57:02
【问题描述】:
我正在开发一个使用 Core Data 的 iOS 7 及更高版本的应用程序,并且我被要求加密持久数据。我在后台使用SQLite 数据库。
我一直在阅读iOS Technology Overview 和App Programming Guide for iOS 中的Data Protection 功能,但我不确定它是否可以与Core Data 一起使用来加密SQLite 文件...可以吗?怎么样?
如果使用Data Protection 和Core Data 是可能的,那是否满足加密存储数据的要求?我的意思是,这就够了吗?我还发现有一些第三方处理SQLite 数据加密,例如SQLCipher。我应该集成其中一种第三方吗?
提前致谢
【问题讨论】:
标签:
ios
sqlite
core-data
encryption
data-protection
【解决方案1】:
[...] 但我不确定它是否可以与 Core Data 一起使用来加密
SQLite 文件...可以吗?
就像this answer 中提到的那样,您应该确保 SQLite 文件本身在创建时被加密。
将NSPersistentStoreFileProtectionKey 与NSFileProtectionComplete 选项一起使用意味着“[...] 文件以加密格式存储在磁盘上,并且在设备锁定或启动时无法读取或写入”。查看所有可用选项的documentation。
与上面提到的 DV_ 一样,这仅在设备获得密码时才有效。
如果可以将数据保护与 Core Data 结合使用,是否会满足
对存储数据加密的要求?
这取决于存储数据的敏感性。 “通常”,Apple 提供的硬件加密对于正常用例来说已经足够了。
如果未设置密码或攻击者可以通过物理访问来解锁设备,则在设备越狱时可以访问数据库文件及其内容。
像 SQLCipher 这样的工具有助于防止这种情况发生,因为您不依赖于系统提供的安全框架。即使设备受到威胁,数据库文件也会被加密,因为加密/解密将由应用程序本身处理。
要保护具有各个属性的数据库文件的内容,您可以使用Transformable Attributes 和NSValueTransformer (details)。
【解决方案2】:
NSDictionary *attr = @{ NSFileProtectionKey : NSFileProtectionComplete };
NSError *error = nil;
[[NSFileManager defaultManager] setAttributes:attr ofItemAtPath:YOUR_DATABASE_PATH error:&error];
但这将使用基于 iPhone 4 位密码和设备 uid 的密钥加密数据库。它不适用于没有密码的手机。