我正在使用 FMDB 与 sqlite 一起工作,我希望避免对 SQLCipher 的依赖。我如何才能简单地利用 iOS 中内置的 DataProtection 功能?这可能吗?唯一的要求是在手机被盗时保护数据。
如果手机是用 PIN 解锁的,那么用户可以访问数据库就可以了——这是他们的数据。
我正在使用 FMDB 与 sqlite 一起工作,我希望避免对 SQLCipher 的依赖。我如何才能简单地利用 iOS 中内置的 DataProtection 功能?这可能吗?唯一的要求是在手机被盗时保护数据。
如果手机是用 PIN 解锁的,那么用户可以访问数据库就可以了——这是他们的数据。
查找您执行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
:
NSFileProtectionNone
: 该文件没有与之相关的特殊保护。它可以随时读取或写入。NSFileProtectionComplete
:文件以加密格式存储在磁盘上,在设备锁定或启动时无法读取或写入。NSFileProtectionCompleteUnlessOpen
:文件以加密格式存储在磁盘上。文件可以在设备锁定时创建,但一旦关闭,在设备解锁之前无法再次打开。如果文件在解锁时打开,即使用户锁定设备,您也可以继续正常访问该文件。当文件被创建和打开时,会有一个小的性能损失,但在写入或读取时不会。这可以通过将文件保护更改NSFileProtectionComplete
为设备解锁时来缓解。NSFileProtectionCompleteUntilFirstUserAuthentication
:文件以加密格式存储在磁盘上,直到设备启动后才能访问。用户首次解锁设备后,您的应用可以访问该文件并继续访问该文件,即使用户随后锁定了该设备。正确的保护类型可能取决于 iOS 的版本(最后两个在 iOS 4 上不可用)以及您在设备锁定时是否使用数据库。
到目前为止,最简单的方法是为整个应用打开数据保护。转到App IDs,单击“编辑”并将“共享和权限”设置为“完全保护”。
使用您的新应用程序 ID 信息更新 Xcode,然后,它将自动为您的应用程序处理。