iphone - 实现和测试 iOS 数据保护

标签 iphone objective-c security ios data-protection

刚刚看了 2010 年 WWDC 的第 209 场 session - 保护应用程序数据。

主题演讲解释了很多事情,包括您可以为文件设置数据保护属性的方式(NSFileProtectionComplete、NSFileProtectionNone)以及如何决定哪种保护最适合您的情况。

我刚刚实现了它,但不知道如何测试安全性是否开启,有什么想法吗?

此外,我有一个 sql lite 数据库,需要不时在后台访问,这种数据保护方法似乎不够好。任何指导我完成最佳数据库保护的链接或教程? (找到了 sql 密码,但在一个进化的项目中添加有点重)

谢谢!

最佳答案

更新:在 iOS 6 中,可以通过使用需要在 iOS 配置文件中的 App ID 上配置的权利来要求对您的应用程序进行数据保护。我还没有测试过,这是我能找到的最好的信息 https://devforums.apple.com/message/707939#707939


我对此事的调查使我相信很难确定设备上是否启用了数据保护。

通过将 NSFileProtectionKey 文件属性设置为 NSFileProtectionComplete 启用文件保护

例如,要创建 protected 文件,您可以运行如下代码:

[[NSFileManager defaultManager] createFileAtPath:[self filePath]
                                        contents:[@"super secret file contents" dataUsingEncoding:NSUTF8StringEncoding]
                                      attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
                                                                             forKey:NSFileProtectionKey]];

不幸的是,即使设备上未启用数据保护(或者如果代码在数据保护不可用的模拟器上运行),此代码也不会出错。

更糟糕的是,无论文件是否 protected ,都会设置 NSFileProtectionComplete 属性。以下内容:

self.fileProtectionValue = [[[NSFileManager defaultManager] attributesOfItemAtPath:[self filePath]
                                                                             error:NULL] valueForKey:NSFileProtectionKey];

NSLog(@"file protection value: %@", self.fileProtectionValue);

无论是否启用数据保护,都会吐出文件保护值:NSFileProtectionComplete

我可以使用两种方法来发现文件保护是否按预期工作。不幸的是,这两种方法都不适合检测现场设备上是否启用了数据保护。

这两种方法都基于这样的想法,即如果设备被锁定,则无法读取 protected 文件。

方法一涉及使用计时器在设备锁定后尝试读取文件,但同时您的应用程序继续运行:

[self performSelector:@selector(doReload) withObject:nil afterDelay:20];

- (void)doReload {

    NSLog(@"protected data available: %@",[[UIApplication sharedApplication] isProtectedDataAvailable] ? @"yes" : @"no");

    NSError *error;

    self.fileContents = [NSString stringWithContentsOfFile:[self filePath]
                                              encoding:NSUTF8StringEncoding
                                                 error:&error];

    NSLog(@"file contents: %@\nerror: %@", self.fileContents, error);
}

如果您运行上面的代码并锁定数据保护设备,它将吐出:

protected data available: no
file contents: (null)
error: Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x16e110 {NSFilePath=/var/mobile/Applications/D71F1F1F-6C25-4848-BB1F-51539B47EC79/Documents/protected_file, NSUnderlyingError=0x16e010 "The operation couldn’t be completed. Operation not permitted"}

20 秒的延迟是必要的,因为有一个 10 秒左右的宽限期,在启用数据保护的设备被锁定后, protected 数据仍然可用。

第二种方法是在应用程序中创建一个 protected 文件,退出应用程序,锁定设备,等待 10 秒,然后使用 XCode 管理器下载应用程序的内容。这将产生一条错误消息,并且 protected 文件将为空。

如果上述任一测试未能按所述运行,则数据保护未启用,或者您的文件保护代码未正确实现。

因为在我将 secret 信息写入磁盘之前,我没有找到任何方法在应用程序中验证是否启用了数据保护,所以我已经向 Apple 提交了功能增强请求,以便能够将应用程序标记为需要数据保护启用。 (雷达站://10167256)

Apple 确实通过其移动设备管理 (MDM) API 提供了解决方案,该 API 与第三方服务器结合可用于强制执行要求在设备上启用数据保护的策略。

关于iphone - 实现和测试 iOS 数据保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5155789/

相关文章:

ios - 如何处理所有可用 iPhone 分辨率的图像比例?

iphone - 使用 AFNetworking 将数据上传到 wcf 服务?终于工作了! (包含 c# 和 obj-c 代码)

objective-c - iOS:重用 UITableViewCell 的 imageView 属性不尊重 contentMode 或 ClipsToBounds

iphone - 清除 UITableViewCell 的背景颜色?

ios - 从 JSON 响应中添加动态字段的最佳方式是什么

iphone - 如何将 .ipa 文件安装到我的 iPhone 模拟器

objective-c - 从另一个 UIBezierPath 减去 UIBezierPath

c - 神秘的内存管理

security - 允许以#(哈希)开头的链接安全吗?

c - 手动修补遗留服务器上的 Ghost 漏洞