开发者可以通过Data Protection API 来设定文件系统中的文件、keychain中的项应该何时被解密

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读取那个文件信息也会被拒绝。



你可能感兴趣的:(encoding,ios)