首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实施和测试iOS数据保护

实施和测试iOS数据保护
EN

Stack Overflow用户
提问于 2011-03-01 22:24:42
回答 7查看 26.8K关注 0票数 26

我刚看了209次会议--从2010 WWDC保护应用程序数据。

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

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

另外,我有一个sql lite数据库,需要不时地在后台访问,这种数据保护方法似乎不够好。任何链接或教程,指导我通过最好的数据库保护?(发现了sql密码,但在一个进化项目中添加起来有点笨重)

谢谢!

EN

回答 7

Stack Overflow用户

发布于 2011-09-22 21:56:02

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

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

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

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

代码语言:javascript
复制
[[NSFileManager defaultManager] createFileAtPath:[self filePath]
                                        contents:[@"super secret file contents" dataUsingEncoding:NSUTF8StringEncoding]
                                      attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
                                                                             forKey:NSFileProtectionKey]];

不幸的是,即使没有在设备上启用数据保护(或者如果代码在模拟器上运行,而数据保护不可用),该代码也将不会出现错误地执行。

更糟糕的是,无论文件是否受保护,都将设置NSFileProtectionComplete属性。以下内容:

代码语言:javascript
复制
self.fileProtectionValue = [[[NSFileManager defaultManager] attributesOfItemAtPath:[self filePath]
                                                                             error:NULL] valueForKey:NSFileProtectionKey];

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

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

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

这两种方法的工作原理都是:如果设备被锁定,则无法读取受保护的文件。

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

代码语言:javascript
复制
[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);
}

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

代码语言:javascript
复制
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秒左右的宽限期,在锁定启用了数据保护的设备后,受保护的数据仍可用。

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

如果上述任何一项测试的行为都不符合说明,则表示未启用数据保护,或者您的文件保护代码未正确实施。

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

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

票数 23
EN

Stack Overflow用户

发布于 2012-04-30 22:33:36

您可以使用iExplorer应用程序来检测您的文件是否已加密。iExplorer可以让你浏览iPhone/iPad的文件系统,并打开文件(当然你的设备必须连接到Mac上)。

当设备被锁定时,无法正确读取文件。

票数 10
EN

Stack Overflow用户

发布于 2011-03-01 22:40:53

NSFileManager类文档中:

文件以加密格式存储在磁盘上,并且在设备锁定或启动期间无法对其进行读取或写入。

只需在设置文件属性时传递常量即可。

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

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

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

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

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

代码语言:javascript
复制
*

  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. 

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

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

更进一步,如果你想测试确切文件的文件保护,那么你需要一个越狱设备。为此,以下是(不详细的)步骤:

1)越狱iOS设备

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

3)从您的计算机(使用Mac客户端或终端)作为root用户登录到您的设备。

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

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

从这里,你可以尝试查看文件是否真的可以访问,当手机被密码锁定时;或者不是。+只需运行cat YouAppName.sqlite即可查看内容是否可访问。Ia f文件受保护,则应显示

不允许

操作

错误;如果要显示文件内容,则返回else。

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

在辅助节点上,诸如iExplorer之类的文件资源管理器工具在验证FileProtection方面帮助不大,因为这些工具要求设备处于“受信任”模式,因此它们有权限访问您设备/应用程序的内容。

祝好运!

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5155789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档