咱們能夠把KeyChain理解爲一個Dictionary,全部數據都以key-value的形式存儲,能夠對這個Dictionary進行add、update、get、delete這四個操做。對於每個應用來講,KeyChain都有兩個訪問區,私有區和公共區。私有區是一個sandbox,本程序存儲的任何數據都對其餘程序不可見。而要想在將存儲的內容放在公共區,須要先聲明公共區的名稱,官方文檔管這個名稱叫「keychain access group」,聲明的方法是新建一個plist文件,名字隨便起,內容以下:ios
「yourAppID.com.yourCompany.whatever」就是你要起的公共區名稱,除了whatever字段能夠隨便定以外,其餘的都必須如實填寫。這個文件的路徑要配置在 Project->build setting->Code Signing Entitlements裏,不然公共區無效,配置好後,須用你正式的證書籤名編譯纔可經過,不然xcode會彈框告訴你code signing有問題。因此,蘋果限制了你只能同公司的產品共享KeyChain數據,別的公司訪問不了你公司產品的KeyChain。
2、保存私密信息
iOS的keychain服務提供了一種安全的保存私密信息(密碼,序列號,證書等)的方式,每一個ios程序都有一個獨立的keychain存儲。相對於NSUserDefaults、文件保存等通常方式,keychain保存更爲安全,並且keychain裏保存的信息不會因App被刪除而丟失,因此在重裝App後,keychain裏的數據還能使用。
在應用裏使用使用keyChain,咱們須要導入Security.framework ,keychain的操做接口聲明在頭文件SecItem.h裏。直接使用SecItem.h裏方法操做keychain,須要寫的代碼較爲複雜,爲減輕我們程序員的開發,咱們可使用一些已經封裝好了的工具類,下面我會簡單介紹下我用過的兩個工具類:KeychainItemWrapper和SFHFKeychainUtils。
(一)KeychainItemWrapper是apple官方例子「GenericKeychain」裏一個訪問keychain經常使用操做的封裝類,在官網上下載了GenericKeychain項目後,只須要把「KeychainItemWrapper.h」和「KeychainItemWrapper.m」拷貝到咱們項目,並導入Security.framework 。KeychainItemWrapper的用法:
/** 初始化一個保存用戶賬號的KeychainItemWrapper */
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number" accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];
//保存賬號
[wrapper setObject:@"<賬號>" forKey:(id)kSecAttrAccount];
//保存密碼
[wrapper setObject:@"<賬號密碼>" forKey:(id)kSecValueData];
//從keychain裏取出賬號密碼
NSString *password = [wrapper objectForKey:(id)kSecValueData];
//清空設置
[wrapper resetKeychainItem];
其中方法「- (void)setObject:(id)inObject forKey:(id)key;」裏參數「forKey」的值應該是Security.framework 裏頭文件「SecItem.h」裏定義好的key,用其餘字符串作key程序會崩潰!
(二)SFHFKeychainUtils 提供了在 iOS keychain中安全的存儲密碼的工具
下載地址https://github.com/ldandersen/scifihifi-iphone/tree/master/security
一、引入Security.frameWork框架。
二、引入頭文件:SFHKeychainUtils.h.
三、存密碼:
[SFHFKeychainUtils storeUsername:@"dd" andPassword:@"aa"forServiceName:SERVICE_NAME updateExisting:1 error:nil];
[SFHFKeychainUtils deleteItemForUsername:@"dd" andServiceName:SERVICE_NAME error:nil];
四、取密碼:
NSString *passWord = [SFHFKeychainUtils getPasswordForUsername:@"dd"andServiceName:SERVICE_NAME error:nil];
可參考連接:
http://blog.csdn.net/yiyaaixuexi/article/details/7688745
http://useyourloaf.com/blog/2010/03/29/simple-iphone-keychain-access.html