实施和测试iOS数据保护

Ome*_*mer 25 security iphone data-protection objective-c ios

刚刚看到了会议209 - 从2010 WWDC获取应用数据.

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

我刚刚实现了它,但无法弄清楚如何测试安全性是否开启,任何想法?

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

谢谢!

Jos*_*ery 22

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


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

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

例如,要创建受保护的文件,您可以运行以下代码:

[[NSFileManager defaultManager] createFileAtPath:[self filePath]
                                        contents:[@"super secret file contents" dataUsingEncoding:NSUTF8StringEncoding]
                                      attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
                                                                             forKey:NSFileProtectionKey]];
Run Code Online (Sandbox Code Playgroud)

遗憾的是,即使设备上未启用数据保护(或者代码在数据保护不可用的模拟器上运行),此代码也会毫无错误地执行.

更糟糕的NSFileProtectionComplete是,无论文件是否受到保护,都将设置该属性.下列:

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

NSLog(@"file protection value: %@", self.fileProtectionValue);
Run Code Online (Sandbox Code Playgroud)

file protection value: NSFileProtectionComplete无论数据保护是否启用,都会吐出.

我已经能够使用两种方法来发现文件保护是否按预期工作.遗憾的是,这些方法都不适合检测是否在现场设备上启用了数据保护.

这两种方法都认为如果设备被锁定,则无法读取受保护的文件.

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

[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);
}
Run Code Online (Sandbox Code Playgroud)

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

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"}
Run Code Online (Sandbox Code Playgroud)

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

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

如果上述任一测试无法按照所述方式运行,则表明数据保护未启用,或者您的文件保护代码未正确实施.

因为在将机密信息写入磁盘之前,我没有找到任何方法在应用程序中验证数据保护已启用,我已向Apple提交了一项功能增强请求,以便能够将应用程序标记为需要启用数据保护.(rdar:// 10167256)

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


XGo*_*het 10

您可以使用iExplorer应用程序检测文件是否已加密.iExplorer允许您浏览iPhone/iPad的文件系统,并打开文件(当然您的设备必须插入Mac).

设备锁定后,无法正确读取文件.

  • 我要补充一点,您需要确保您的设备未在XCode管理器中作为开发人员设备启用.因此,您需要右键单击它并忽略.重启电话可能也是个好主意,我拿着电源和主页按钮,直到拿到苹果标志.之后,当设备被锁定并且您尝试从iExplorer中提取文件时,操作将无提示失败(您不会收到错误但不会提取文件) (2认同)
  • 您可以在使用iExplorer推送到设备的调试应用程序上测试吗?我将我的权利文件设置为FileProtectComplete,但是如果我锁定设备,iExplorer仍然可以看到所有文件. (2认同)

iHS*_*iHS 8

NSFileManager类doc:

该文件以加密格式存储在磁盘上,在设备锁定或引导时无法读取或写入.

您只需在设置文件属性时传递常量.

使用writeToFile:options:error:方法将NSData对象的内容写入磁盘时,请包含NSDataWritingFileProtectionComplete选项.

使用setAttributes:ofItemAtPath:error:NSFileManager方法将NSFileProtectionKey属性(带有NSFileProtectionComplete值)添加到现有文件

http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StandardBehaviors/StandardBehaviors.html

编辑(确定受保护文件的可用性)

只有在设备解锁时才能访问受保护的文件.由于应用程序可能会在设备锁定时继续运行,因此您的代码应准备好处理受保护文件随时变得不可用的可能性.UIKit框架提供了跟踪当前是否启用数据保护的方法.

*

  Use applicationProtectedDataWillBecomeUnavailable: and applicationProtectedDataDidBecomeAvailable: methods and use them to track changes to the availability of protected data.
*

  An application can register for the UIApplicationProtectedDataWillBecomeUnavailable and UIApplicationProtectedDataDidBecomeAvailable notifications.
*

  The protectedDataAvailable property of the shared UIApplication object indicates whether protected files are currently accessible. 
Run Code Online (Sandbox Code Playgroud)

任何使用受保护文件的应用程序都应实现应用程序委托方法.当调用applicationProtectedDataWillBecomeUnavailable:方法时,应用程序应立即关闭所有受保护的文件,并且在调用applicationProtectedDataDidBecomeAvailable:方法之前不要再使用它们.在受保护文件不可用时访问受保护文件的任何尝试都将失败.

验证越狱设备上的文件保护

更进一步,如果您想测试精确文件的文件保护,那么您将需要一个越狱设备.为此,这里是(非详细的)步骤:

1)越狱iOS设备

2)通过Cydia安装Open SSH(这是从该设备远程访问文件所必需的)(https://cydia.saurik.com/openssh.html)

3)以root用户身份从您的计算机(使用Mac客户端或终端)登录到您的设备.

要查找应用程序目录和文件的位置,有多种方法.你可以

  • grep应用程序的过程(例如ps ax | grep YourAppName) - 确保应用程序在设备上运行以获取进程详细信息.它应该给出应用程序包的位置
  • 或者,您也可以使用find您感兴趣的搜索特定文件.例如.find / -type f -name YouAppName.sqlite.它应该在设备上给出文件位置.

从这里开始,当手机被密码锁定时,您可以尝试查看文件是否真的可访问; 或不.- 您可以简单地运行cat YouAppName.sqlite以查看内容是否可访问.Ia f文件受保护,应该显示

不允许操作

错误; 否则如果显示文件的内容.

同样,如果您真的想检查单个文件的文件保护,则需要这样做.如果权限和功能设置正确,则验证权限应足以进行文件保护.

在侧节点上,文件资源管理器工具(如iExplorer)对FileProtection的验证没有多大帮助,因为此类工具要求设备处于"受信任"模式,因此他们有权访问您的设备/应用程序的内容.

祝好运!

  • 好的..但我该如何测试保护?我的意思是,我想做一些告诉我该文件受到保护的事情 (5认同)

Dec*_*nna 5

测试可以在Xcode中完成:

  1. 删除并重新安装您的应用
  2. 在iOS设备上,转到"设置">"密码",确保"要求密码"设置为"立即"
  3. 锁定手机并等待20秒
  4. 在Xcode上转到Window> Devices
  5. 选择您要测试的应用
  6. 单击设置cog并选择"下载容器"
  7. 右键单击下载的.xcappdata文件,然后选择"显示包内容".您在此处可以查看的任何内容都未加密NSFileProtectionComplete
  8. 解锁手机并重复步骤3-6.之前未显示您现在可以查看的文件已成功加密.

在此输入图像描述