文件系統(tǒng)中的文件、keychain 中的項(xiàng),都是加密存儲(chǔ)的。當(dāng)用戶解鎖設(shè)備后,系統(tǒng)通過(guò) UDID 密鑰和用戶設(shè)定的密碼生成一個(gè)用于解密的密碼密鑰,存放在內(nèi)存中,直到設(shè)備再次被鎖,開(kāi)發(fā)者可以通過(guò) Data Protection API 來(lái)設(shè)定文件系統(tǒng)中的文件、keychain 中的項(xiàng)應(yīng)該何時(shí)被解密。
文件保護(hù)
/* 為filePath文件設(shè)置保護(hù)等級(jí) */
NSDictionary *attributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete
forKey:NSFileProtectionKey];
[[NSFileManager defaultManager] setAttributes:attributes
ofItemAtPath:filePath
error:nil];
//文件保護(hù)等級(jí)屬性列表
NSFileProtectionNone? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //文件未受保護(hù),隨時(shí)可以訪問(wèn) (Default)
NSFileProtectionComplete? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //文件受到保護(hù),而且只有在設(shè)備未被鎖定時(shí)才可訪問(wèn)
NSFileProtectionCompleteUntilFirstUserAuthentication? ? //文件收到保護(hù),直到設(shè)備啟動(dòng)且用戶第一次輸入密碼
NSFileProtectionCompleteUnlessOpen? ? ? ? ? ? ? ? ? ? ? //文件受到保護(hù),而且只有在設(shè)備未被鎖定時(shí)才可打開(kāi),不過(guò)即便在設(shè)備被鎖定時(shí),已經(jīng)打開(kāi)的文件還是可以繼續(xù)使用和寫入
keychain 項(xiàng)保護(hù)
/* 設(shè)置keychain項(xiàng)保護(hù)等級(jí) */
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項(xiàng)保護(hù)等級(jí)列表
kSecAttrAccessibleWhenUnlocked? ? ? ? ? ? ? ? ? ? ? ? ? //keychain項(xiàng)受到保護(hù),只有在設(shè)備未被鎖定時(shí)才可以訪問(wèn)
kSecAttrAccessibleAfterFirstUnlock? ? ? ? ? ? ? ? ? ? ? //keychain項(xiàng)受到保護(hù),直到設(shè)備啟動(dòng)并且用戶第一次輸入密碼
kSecAttrAccessibleAlways? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //keychain未受保護(hù),任何時(shí)候都可以訪問(wèn) (Default)
kSecAttrAccessibleWhenUnlockedThisDeviceOnly? ? ? ? ? ? //keychain項(xiàng)受到保護(hù),只有在設(shè)備未被鎖定時(shí)才可以訪問(wèn),而且不可以轉(zhuǎn)移到其他設(shè)備
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly? ? ? ? //keychain項(xiàng)受到保護(hù),直到設(shè)備啟動(dòng)并且用戶第一次輸入密碼,而且不可以轉(zhuǎn)移到其他設(shè)備
kSecAttrAccessibleAlwaysThisDeviceOnly? ? ? ? ? ? ? ? ? //keychain未受保護(hù),任何時(shí)候都可以訪問(wèn),但是不能轉(zhuǎn)移到其他設(shè)備
應(yīng)用實(shí)例
把一段信息 infoStrng 字符串寫進(jìn)文件,然后通過(guò) Data Protection API 設(shè)置保護(hù)。
設(shè)備鎖屏(帶密碼保護(hù))后,即使是越獄機(jī),在 root 權(quán)限下 cat 讀取那個(gè)文件信息也會(huì)被拒絕。