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
我对此事的调查使我相信很难确定设备上是否启用了数据保护.
通过将NSFileProtectionKey
file属性设置为启用文件保护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).
设备锁定后,无法正确读取文件.
从NSFileManager类doc:
该文件以加密格式存储在磁盘上,在设备锁定或引导时无法读取或写入.
您只需在设置文件属性时传递常量.
使用writeToFile:options:error:方法将NSData对象的内容写入磁盘时,请包含NSDataWritingFileProtectionComplete选项.
使用setAttributes:ofItemAtPath:error:NSFileManager方法将NSFileProtectionKey属性(带有NSFileProtectionComplete值)添加到现有文件
编辑(确定受保护文件的可用性)
只有在设备解锁时才能访问受保护的文件.由于应用程序可能会在设备锁定时继续运行,因此您的代码应准备好处理受保护文件随时变得不可用的可能性.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的验证没有多大帮助,因为此类工具要求设备处于"受信任"模式,因此他们有权访问您的设备/应用程序的内容.
祝好运!
测试可以在Xcode中完成:
NSFileProtectionComplete
归档时间: |
|
查看次数: |
24679 次 |
最近记录: |