天天看點

ios keychain使用研究

[[[關于keychain這個東西的概念可以到這裡學習:

https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices/index.html, 簡言之就是每個應用程式都有一個可以用于安全儲存一些如密碼、認證等資訊的keychain,通過對應用簽名時的一些設定,還可以利用keychain的方式實作同一開發者簽證(就是相同bundle seed)下的不同應用之間共享資訊的操作。比如你有一個開發者帳戶,并開發了兩個不同的應用A和B,然後通過對A和B的keychain access group這個東西指定共用的通路分組,就可以實作共享此keychain中的内容。而且,對比NSUserDefaults的一點不同之處就是此資訊不會随應用的删除而消失!

關于Keychain的應用,Apple提供了一個叫GenericKeychain的例子程式,在這裡:http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_h.html#//apple_ref/doc/uid/DTS40007797-Classes_KeychainItemWrapper_h-DontLinkElementID_9,其中封裝了一個簡化Keychain操作的類:KeychainItemWrapper,可以拿來直接使用,記得加入Security.framework!

]]]

參考代碼如下:

 KeychainItemWrapper *wrapper = [[KeychainItemWrapperalloc]initWithIdentifier:@"password"accessGroup:nil];

 // 設定資料

 NSString *uuid = [[NSUUID UUID] UUIDString];

 [wrapper setObject:uuid forKey:kSecAttrAccount];

 // 讀取資料

 NSString *uuid2 = [wrapperobjectForKey:kSecAttrAccount];

 [wrapper release];

關于keychain access groups的設定,傳統方法是在Xcode項目target的Build Settings的Code Signing段中加入Code Signing Entitlements的配置檔案,加入group資訊,詳細操作如下。

1)首先,打開keychain sharing配置。

ios keychain使用研究

2)在build setting裡可以看到,配置檔案的索引。

ios keychain使用研究

3)這是配置檔案:

ios keychain使用研究

Keychain Access Groups是一個在不同應用見公用鑰匙串的标志。

$(AppIdentifierPrefix)是每個開發賬号的id,在member center裡可以看到。

com.icomwell:這個icomwell一般是公司名稱。

.icomwell:第二個icomwell一般是參數名稱。

不同的應用,配置相同的Groups後,就可以公用儲存的資料。

現在再看下這個示例代碼:

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"password" accessGroup:nil];

password是這個groups下的一個辨別符。一個辨別符下可以有多個參數。以字典形式儲存。

比如

 // 設定資料

 NSString *uuid = [[NSUUID UUID] UUIDString];

 [wrapper setObject:uuid forKey:kSecAttrAccount];

 [wrapper setObject:@"test" forKey:kSecAttrLabel];

這就設定了兩個key的value。每個key根據根據配置的class來,比如這個kSecClassGenericPassword包括這麼多key

 // 讀取資料

 NSString *uuid2 = [wrapper objectForKey:kSecAttrAccount];

 [wrapper release];

當遇到奔潰時,可以查到錯誤碼:比如add時遇到–25299,這個一般是key和對應的class不比對造成的,其他的可以檢視文檔。

matching時遇到–25300,這個是查詢不到參數。

[[[經過測試有以下經驗同大家分享:

1.相同bundle下生成的程式都可以共享相同group的keyChain.

相同bundle解釋下就是:比如:2個程式分别使用的provision對應bundle是com.jv.key1和com.jv.key2,那你配置檔案肯定是{Identifer}.com.jv.{name},其中identifer是蘋果生成的随機串号,可以在申請證書時看到,複制過來即可,name可以自己取,程式中指定屬于哪個Group即可。

2.如果你在 addkey時,沒有指定group,則會預設添加你keychain-access-groups裡第一個group,如果你沒有設定Entitlements,則預設使用對應的程式的bundle name,比如com.jv.key1,表示隻能給自己程式使用。

3.如果你程式添加的group并不存在你的配置檔案中,程式會奔潰,表示無法添加。是以你隻能添加你配置檔案中支援的keychain。]]]

關于keychain,這篇文章寫的不錯,大家可以參考:http://blog.csdn.net/jerryvon/article/details/16843065

繼續閱讀