FMDB和加密

Con*_*oob 4 sqlite encryption objective-c fmdb ios

我正在使用FMDB来处理sqlite,我宁愿避免依赖SQLCipher.我怎样才能简单地利用iOS内置的DataProtection功能?这是可能的 - 唯一的要求是在手机被盗时保护数据.

如果使用PIN解锁手机,那么用户可以访问数据库是好的 - 这是他们的数据.

eik*_*eik 5

查找您执行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);
}
Run Code Online (Sandbox Code Playgroud)

可能的值NSFileProtectionKey关键是:

  • NSFileProtectionNone:该文件没有与之关联的特殊保护.它可以随时读取或写入.
  • NSFileProtectionComplete:文件以加密格式存储在磁盘上,在设备锁定或引导时无法读取或写入.
  • NSFileProtectionCompleteUnlessOpen:文件以加密格式存储在磁盘上.可以在设备锁定时创建文件,但一旦关闭,在设备解锁之前无法再次打开.如果在解锁时打开文件,即使用户锁定设备,您也可以继续正常访问该文件.创建和打开文件时会有一个小的性能损失,但不是在写入或读取时.通过将文件保护更改NSFileProtectionComplete为设备解锁时可以减轻这种情况.
  • NSFileProtectionCompleteUntilFirstUserAuthentication:文件以加密格式存储在磁盘上,直到设备启动后才能访问.用户首次解锁设备后,即使用户随后锁定了设备,您的应用也可以访问该文件并继续访问该文件.

正确的保护类型可能取决于iOS的版本(最后两个在iOS 4上不可用)以及在设备锁定时是否使用数据库.