【发布时间】:2013-08-21 23:35:55
【问题描述】:
我正在使用 FMDB 来处理 sqlite,我希望避免对 SQLCipher 的依赖。我如何才能简单地利用 iOS 中内置的 DataProtection 功能?这可能吗?唯一的要求是在手机被盗时保护数据。
如果手机使用 PIN 码解锁,用户可以访问数据库是正常的 - 这是他们的数据。
【问题讨论】:
标签: ios objective-c sqlite encryption fmdb
我正在使用 FMDB 来处理 sqlite,我希望避免对 SQLCipher 的依赖。我如何才能简单地利用 iOS 中内置的 DataProtection 功能?这可能吗?唯一的要求是在手机被盗时保护数据。
如果手机使用 PIN 码解锁,用户可以访问数据库是正常的 - 这是他们的数据。
【问题讨论】:
标签: ios objective-c sqlite encryption fmdb
寻找你做databaseWithPath:(或initWithPath:)的那一行,然后添加:
FMDatabase *db = [FMDatabase databaseWithPath:path];
NSDictionary *attributes = @{NSFileProtectionKey: NSFileProtectionCompleteUnlessOpen};
NSError *error;
BOOL success = [[NSFileManager defaultManager] setAttributes:attributes
ofItemAtPath:path
error:&error];
if (!success) {
NSLog(@"File protection failed: %@", error);
}
NSFileProtectionKey 键的possible Values 是:
NSFileProtectionNone:
该文件没有与之相关的特殊保护。可以随时读取或写入。NSFileProtectionComplete:
该文件以加密格式存储在磁盘上,在设备锁定或启动时无法读取或写入。NSFileProtectionCompleteUnlessOpen:
该文件以加密格式存储在磁盘上。文件可以在设备锁定时创建,但一旦关闭,在设备解锁之前无法再次打开。如果文件在解锁时打开,即使用户锁定设备,您也可以继续正常访问该文件。当文件被创建和打开时,会有一个小的性能损失,虽然在被写入或读取时不会。这可以通过在设备解锁时将文件保护更改为 NSFileProtectionComplete 来缓解。NSFileProtectionCompleteUntilFirstUserAuthentication:
该文件以加密格式存储在磁盘上,直到设备启动后才能访问。用户首次解锁设备后,您的应用可以访问该文件并继续访问该文件,即使用户随后锁定了设备。正确的保护类型可能取决于 iOS 版本(最后两个在 iOS 4 上不可用)以及您在设备锁定时是否使用数据库。
【讨论】:
到目前为止,最简单的方法是为整个应用开启数据保护。转到App IDs,点击“编辑”,将“共享和权限”设置为“完全保护”。
使用您的新应用程序 ID 信息更新 Xcode,然后,系统会自动为您的应用程序处理它。
【讨论】:
[NSFileManager setAttibutes:] 和NSFileProtectionKey : NSFileProtectionComplete。请参阅此 preso 的第 18 页:github.com/rnapier/practical-security/blob/master/….
NSFileProtectionKey : NSFileProtectionComplete?在 Core Data 中使用后台上下文进行后台访问是否有效?