陈斌彬的技术博客

Stay foolish,stay hungry

数据保护API

1.文件保护

/* 为filePath文件设置保护等级 */  
NSDictionary *attributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete  
                                                       forKey:NSFileProtectionKey];  
[[NSFileManager defaultManager] setAttributes:attributes  
                                 ofItemAtPath:filePath  
                                        error:nil];  

//文件保护等级属性列表  
NSFileProtectionNone                                    //文件未受保护,随时可以访问 (Default)  
NSFileProtectionComplete                                //文件受到保护,而且只有在设备未被锁定时才可访问  
NSFileProtectionCompleteUntilFirstUserAuthentication    //文件收到保护,直到设备启动且用户第一次输入密码  
NSFileProtectionCompleteUnlessOpen                      //文件受到保护,而且只有在设备未被锁定时才可打开,不过即便在设备被锁定时,已经打开的文件还是可以继续使用和写入  

2.keychain项保护

/* 设置keychain项保护等级 */  
NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,  
                        (__bridge id)kSecAttrGeneric:@"MyItem",  
                        (__bridge id)kSecAttrAccount:@"username",  
                        (__bridge id)kSecValueData:@"password",  
                        (__bridge id)kSecAttrService:[NSBundle mainBundle].bundleIdentifier,  
                        (__bridge id)kSecAttrLabel:@"",  
                        (__bridge id)kSecAttrDescription:@"",  
                        (__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleWhenUnlocked};    

OSStatus result = SecItemAdd((__bridge CFDictionaryRef)(query), NULL);  

//keychain项保护等级列表  
kSecAttrAccessibleWhenUnlocked                          //keychain项受到保护,只有在设备未被锁定时才可以访问  
kSecAttrAccessibleAfterFirstUnlock                      //keychain项受到保护,直到设备启动并且用户第一次输入密码  
kSecAttrAccessibleAlways                                //keychain未受保护,任何时候都可以访问 (Default)  
kSecAttrAccessibleWhenUnlockedThisDeviceOnly            //keychain项受到保护,只有在设备未被锁定时才可以访问,而且不可以转移到其他设备  
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly        //keychain项受到保护,直到设备启动并且用户第一次输入密码,而且不可以转移到其他设备  
kSecAttrAccessibleAlwaysThisDeviceOnly                  //keychain未受保护,任何时候都可以访问,但是不能转移到其他设备  

应用实例

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

img

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

NSString * infoString = @"DataProtect";
NSString *documentsPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"DataProtect"];

NSLog(@"filePath is %@",filePath);

[infoString writeToFile:filePath
             atomically:YES
               encoding:NSUTF8StringEncoding
                  error:nil];
NSDictionary *attributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete
                                                       forKey:NSFileProtectionKey];
[[NSFileManager defaultManager] setAttributes:attributes
                                 ofItemAtPath:filePath
                                        error:nil];
}

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

Resource Reference