火锅加糖

仗剑行千里,微躯敢一言。
曾为大梁客,不负信陵恩。

Vno Jekyll is a port of my Ghost theme vno.


Download the theme

Data protection 数据保护(data protection)

###数据保护(Data Protection)— layout: post title: Sample Post date: 2018-04-14 15:32:24.000000000 +09:00 —

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

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设置保护。

    NSString *documentsPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"DataProtect"];
    [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读取那个文件信息也会被拒绝!

最近的文章

Git Git常用命令总结

###Git常用命令总结—layout: posttitle: Sample Postdate: 2018-04-14 15:32:24.000000000 +09:00—基本命令{% highlight ruby %} git config –global user.name “Your Name”设置你的仓库用户名(用于标识提交者) git config –global user.name “email@example.com”设置你的仓库邮箱(用于标识提交者) gi...…

继续阅读
更早的文章

Ios Uitableview的使用与注意

###tableView的使用与注意—layout: posttitle: Sample Postdate: 2016-02-15 15:32:24.000000000 +09:00—关于tableview的基本使用不再赘述,只针对项目中可能出现的一些问题。1.tableView的分割线处理方法 开发中会出现,明明已经将分割线隐藏了,但是当选中cell的时候,还是会出现分割线,这里提供几个方法对分割线进行处理。 //遍历取得UITableViewCellSeparatorVie...…

继续阅读