数据保护API

题外话

开篇先扯几句题外话,许多朋友都问我怎么不写防啊,我确实有点犹豫。
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读取那个文件信息也会被拒绝。

最新文章

  1. textbox button 模拟fileupload
  2. Apache伪静态在网站目录没有反斜杠后自动添加反斜杠
  3. 关于数组的map、reduce、filter
  4. WPS文字在表格中打字自动跳动
  5. Python字符界面函数库
  6. Oracle :一次数据库连接,返回多个结果集
  7. html5学习笔记——2016/4
  8. N个数字中随机取m个数子,不重复
  9. 集合练习——Map部分
  10. mac下离线博客编辑器 marsedit 3.6.8 注册码
  11. JAVA 第二天 关键字
  12. 《Unity3D/2D游戏开发从0到1》正式出版发行
  13. layer.photos()异步修改图片地址后显示异常
  14. Singleton多种实现方式的在多线程情况下的优缺点
  15. svn Mac
  16. binlog和redo log日志提交
  17. Ubuntu12.04软件安装指南
  18. [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  19. Notepad++源代码阅读——窗口元素组织与布局
  20. nginx 上php不可写解决方法

热门文章

  1. SpringBoot配置RestTemplate的代理和超时时间
  2. vmware中的 CentOS7 虚机磁盘动态扩容
  3. Tomcat默认界面可导致版本信息泄露+管理后台爆破
  4. IntelliJ IDEA遇到Unable to parse template “Class”错误
  5. 【win7 + win server 2008】设置定时任务,设置.bat 文件去执行php脚本 == 用来配合爬虫程序简直不要太爽
  6. ios中屏幕适配
  7. dx11的一些数据结构
  8. set方法的内存管理细节
  9. Oracle pl/sql导入sql文件,插入更新数据,中文乱码问题解决方案
  10. IDEA 配置Gradle编译工具