zoukankan      html  css  js  c++  java
  • iOS安全攻防(十八):数据保护API

    数据保护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.       
    11. 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读取那个文件信息也会被拒绝。

  • 相关阅读:
    ShareX 图虫
    电网规划大数据一体化平台
    写给工程师的 Ubuntu 20.04 最佳配置指南
    UML 建模 各种图总结
    linux 牛人推荐书籍
    客服工单系统 设计
    《走出软件作坊》 吕建伟 coder CIO ERP OA 架构 管理 趋势 用友
    Deploy a Kubernetes Desktop Cluster with Ubuntu Multipass
    那些做了一半的项目 | 四火的唠叨
    org.apache.http.client.HttpResponseException: Request Entity Too Large
  • 原文地址:https://www.cnblogs.com/ios8/p/ios-data-protect.html
Copyright © 2011-2022 走看看