ios中KeyChain用途

一、在應用間利用KeyChain共享數據

       我們可以把KeyChain理解爲一個Dictionary,所有數據都以key-value的形式存儲,可以對這個Dictionary進行add、update、get、delete這四個操作。對於每一個應用來說,KeyChain都有兩個訪問區,私有區和公共區。私有區是一個sandbox,本程序存儲的任何數據都對其他程序不可見。而要想在將存儲的內容放在公共區,需要先聲明公共區的名稱,官方文檔管這個名稱叫“keychain access group”,聲明的方法是新建一個plist文件,名字隨便起,內容如下:

 

 

20131106010851813.jpeg

“yourAppID.com.yourCompany.whatever”就是你要起的公共區名稱,除了whatever字段可以隨便定之外,其他的都必須如實填寫。這個文件的路徑要配置在 Project->build setting->Code Signing Entitlements裏,否則公共區無效,配置好後,須用你正式的證書籤名編譯纔可通過,否則xcode會彈框告訴你code signing有問題。所以,蘋果限制了你只能同公司的產品共享KeyChain數據,別的公司訪問不了你公司產品的KeyChain。

 

二、保存私密信息

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

 

1、引入Security.frameWork框架。

 

2、引入頭文件:SFHKeychainUtils.h.

 

3、存密碼:

 

[SFHFKeychainUtils storeUsername:@"dd" andPassword:@"aa"forServiceName:SERVICE_NAME updateExisting:1 error:nil];

 

[SFHFKeychainUtils deleteItemForUsername:@"dd" andServiceName:SERVICE_NAME error:nil];

 

4、取密碼:

 

NSString *passWord =  [SFHFKeychainUtils getPasswordForUsername:@"dd"andServiceName:SERVICE_NAME error:nil];


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章