(转)iOS安全 对本地文件的保护

开篇先扯几句题外话,许多朋友都问我怎么不写防啊,我确实有点犹豫。
hackers总是想象如果自己是开发者会怎么写,然后才能找到入手点。同理,开发者们也要想象自己是hackers会怎么做,才能采取相应的防御措施。然后,就是一场递归的博弈。
拿越狱检测这件事来说,起初大家只需判断有无安装Cydia就好了,hackers们说好,那我就不安装Cydia也可以动手脚。开发者们又说,那你一定得用的上MobileSubstrate,bash,ssh吧,我去检测手机有没有安装这些工具。可是又有什么用呢?你判断什么我绕过去什么。

当class-dump大肆流行,函数符号都被暴露,开发者想尽办法藏起自己的敏感函数代码。hackers们也知道class-dump的死穴在哪里,于是新的检索办法油然而生。也就说,当一个防御手段成为流行,它就不会再是个让hackers大骂“真特么费劲”的防御手段了。比如之前介绍的一个小技巧:内存数据擦除  ,hackers知道开发者都去擦数据了,那我hook memset在你擦之前去读就好了。开发者说:我直接写硬盘上然后删除!hackers说:难道你没听说过文件恢复?

OK,贫的有点多了,本文介绍一下防御相关的话题————iOS的数据保护API。

数据保护API

文件系统中的文件、keychain中的项,都是加密存储的。当用户解锁设备后,系统通过UDID密钥和用户设定的密码生成一个用于解密的密码密钥,存放在内存中,直到设备再次被锁,开发者可以通过Data Protection API 来设定文件系统中的文件、keychain中的项应该何时被解密。

1)文件保护

  1. /* 为filePath文件设置保护等级 */
  2. NSDictionary *attributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete
  3. forKey:NSFileProtectionKey];
  4. [[NSFileManager defaultManager] setAttributes:attributes
  5. ofItemAtPath:filePath
  6. error:nil];
  1. //文件保护等级属性列表
  2. NSFileProtectionNone                                    //文件未受保护,随时可以访问 (Default)
  3. NSFileProtectionComplete                                //文件受到保护,而且只有在设备未被锁定时才可访问
  4. NSFileProtectionCompleteUntilFirstUserAuthentication    //文件收到保护,直到设备启动且用户第一次输入密码
  5. NSFileProtectionCompleteUnlessOpen                      //文件受到保护,而且只有在设备未被锁定时才可打开,不过即便在设备被锁定时,已经打开的文件还是可以继续使用和写入

2)keychain项保护

  1. /* 设置keychain项保护等级 */
  2. NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
  3. (__bridge id)kSecAttrGeneric:@"MyItem",
  4. (__bridge id)kSecAttrAccount:@"username",
  5. (__bridge id)kSecValueData:@"password",
  6. (__bridge id)kSecAttrService:[NSBundle mainBundle].bundleIdentifier,
  7. (__bridge id)kSecAttrLabel:@"",
  8. (__bridge id)kSecAttrDescription:@"",
  9. (__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleWhenUnlocked};
  10. OSStatus result = SecItemAdd((__bridge CFDictionaryRef)(query), NULL);
  1. //keychain项保护等级列表
  2. kSecAttrAccessibleWhenUnlocked                          //keychain项受到保护,只有在设备未被锁定时才可以访问
  3. kSecAttrAccessibleAfterFirstUnlock                      //keychain项受到保护,直到设备启动并且用户第一次输入密码
  4. kSecAttrAccessibleAlways                                //keychain未受保护,任何时候都可以访问 (Default)
  5. kSecAttrAccessibleWhenUnlockedThisDeviceOnly            //keychain项受到保护,只有在设备未被锁定时才可以访问,而且不可以转移到其他设备
  6. kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly        //keychain项受到保护,直到设备启动并且用户第一次输入密码,而且不可以转移到其他设备
  7. kSecAttrAccessibleAlwaysThisDeviceOnly                  //keychain未受保护,任何时候都可以访问,但是不能转移到其他设备

应用实例

把一段信息infoStrng字符串写进文件,然后通过Data Protection API设置保护。

  1. NSString *documentsPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
  2. NSString *filePath = [documentsPath stringByAppendingPathComponent:@"DataProtect"];
  3. [infoString writeToFile:filePath
  4. atomically:YES
  5. encoding:NSUTF8StringEncoding
  6. error:nil];
  7. NSDictionary *attributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete
  8. forKey:NSFileProtectionKey];
  9. [[NSFileManager defaultManager] setAttributes:attributes
  10. ofItemAtPath:filePath
  11. error:nil];

设备锁屏(带密码保护)后,即使是越狱机,在root权限下cat读取那个文件信息也会被拒绝。

注:转自博客http://www.cnblogs.com/ios8/p/ios-data-protect.html。

时间: 2024-10-30 21:09:05

(转)iOS安全 对本地文件的保护的相关文章

iOS5可能会删除本地文件储存 - Caches 也不安全

转自:http://blog.163.com/ray_jun/blog/static/1670536422011101225132544/ 出处:http://superman474.blog.163.com/blog/static/120661462011101115811199/ 关于iOS 5的本地文件储存Marco(Instapaper 的开发者)写过一篇很好的帖子阐述过相关问题,有兴趣的同学可以先阅读下他的文章然后再看下文. 在苹果开发者的论坛上也有许多相关问题的讨论贴: 安全地保存文

iOS如何获得本地Documents下的文件夹名称或文件名称

用NSFileManager类中方法: NSString *[email protected]"文件夹路径"; NSFileManager * fm = [NSFileManager DefaultManager]; NSArray  *arr = [fm  directoryContentsAtPath:path]; 枚举这个数组就行,数组中的元素就是你要的文件名 iOS如何获得本地Documents下的文件夹名称或文件名称,布布扣,bubuko.com

IOS UIwebView加载本地文件(支持显示图片)

1,本地的html文件一定要放到工程文件的根目录 2,html代码中的图片路径一定要是相对路径 3,下面是用UIWebView调用本地文件的方法 方法一: NSString *filePath = [[NSBundle mainBundle]pathForResource:@"1" ofType:@"html"]; NSString *htmlString = [NSString stringWithContentsOfFile:filePath encoding:

iOS开发网络篇—文件的上传

iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: YYViewController.m 1 #import "YYViewController.h" 2 3 #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding] 4 5 @inter

使用Charles代理功能将网络请求定向至本地文件

最近在进行前端开发的时候发现Charles一个非常牛叉的功能,就是可以通过代理将网络请求定向至本地文件.有了这个功能在进行iOS开发时就可以在缺少后台接口的情况下更加真实的进行数据mock了(反正我们公司的后台...不想吐槽了). 我们先用NSURLSession发送一段简单的post请求: NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://192.12

ios如何实现本地推送,兼容ios8

如果要兼容IOS8在IOS中实现本地推送,关键是要注意:ios8在实现本地推送时需要通过如下语句进行注册. [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings]; 至于IOS8之前版本的做法就不多说了,直接上代码.新建oc类文件(NotificationHelper),在NotificationHelper.h中声明相关方法如下: #import <UIKit/UIKit.h> @inte

unity 各平台本地文件的读取目录

在win上,将配置文件放在了 Application.dataPath 目录下,编辑状态下,测试通过.发布为exe后,读取失败.后来将配置文件放到生成的_data文件下,通过. 当然想到以后发布到其他平台,在移动端下 Application.persistentDataPath  才是移动端可用的保存生成文件的地方,放到resource中打包后不可以更改了,放到Application .dataPath中移动端是没有访问权限的.需要修改的文件建议放在Application.persistentD

Html5 本地文件读取 API 研究使用过程中的意外发现 - MDN

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 补充: 终于可以读出肉的眼能看懂的人类文字了!!! 经在 safari 7.0.4(9537.76.4) 测试,即使关闭 WebGL 支持,Fil

iOS开发-网络篇 文件的上传

iOS开发网络篇—文件的上传 iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: YYViewController.m 1 #import "YYViewController.h" 2 3 #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncod