1.keychain的功能
keychain,中文翻譯成鑰匙串,可以算作是Apple一切從用戶需求出發(fā)的一個(gè)例子吧。目前手機(jī)和電腦早已經(jīng)不僅僅是打電話和上網(wǎng)這些功能了,個(gè)人電腦或者智能手機(jī)可以看作是一個(gè)人的特征的標(biāo)識,手機(jī)或者電腦中保存了大量用戶所獨(dú)有的數(shù)據(jù)信息,每個(gè)人都應(yīng)當(dāng)關(guān)注自己信息的保密問題。去年CSDN網(wǎng)站被報(bào)到出用明文保存密碼,并且被黑客獲取,這也提醒著大家需要注意對密碼的管理。
Apple應(yīng)該很早就意識到了這樣的問題,不過keychain項(xiàng)目也是幾經(jīng)波折才發(fā)展成現(xiàn)在這個(gè)樣子。目前keychain的主要功能就是幫助用戶安全地記住他的密碼,keychain保存的密碼文件都是經(jīng)過加密的,其它人不能直接通過打開keychain的文件獲得保存在keychain中的密碼。在mac上可以安裝鑰匙串應(yīng)用,一般情況下只有用戶正確輸入了mac系統(tǒng)的用戶名和密碼才能查看到用戶保存在keychain中的密碼。
Apple還提供了使用keychain保存密碼的API,如果應(yīng)用程序使用了keychain?API來保存密碼,保存密碼的結(jié)果都可以在鑰匙串應(yīng)用中查看到。Apple自帶的瀏覽器Safari就是用的keychain來保存密碼的,當(dāng)用戶在一個(gè)網(wǎng)頁中輸入了用戶名和密碼之后,Safari會(huì)詢問用戶是否需要記住密碼。如果用戶選擇記住Safari則會(huì)采用keychain進(jìn)行密碼的保存,在下次用戶再次訪問同一個(gè)網(wǎng)站的時(shí)候,系統(tǒng)會(huì)自動(dòng)進(jìn)行用戶名和密碼的填充。同時(shí)在鑰匙串程序中,可以看到Safari保存的針對特定網(wǎng)頁的用戶名,在輸入了系統(tǒng)登錄密碼之后可以查看到對應(yīng)的密碼明文。
2.iOS中使用keychain和userdefaults保存數(shù)據(jù)的對比
userdefault適合保存一些輕量級的數(shù)據(jù),使用userdefault保存的數(shù)據(jù)加載的時(shí)候要快一些,數(shù)據(jù)以明文的形式保存在.plist文件中,不適合用來保存密碼信息。文件的位置是Library/Application?Support/iPhone?Simulator/模擬器版本/Applications/應(yīng)用對應(yīng)的數(shù)字/Library/Preference/.plist文件
keychain采用的是將數(shù)據(jù)加密之后再保存到本地的,這樣對數(shù)據(jù)而言有更高的安全性,適合保存密碼之類的數(shù)據(jù)。數(shù)據(jù)保存的目錄是Library/Application?Support/iPhone?Simulator/模擬器版本/Library/Keychains/
3.SSKeychain的使用
Apple針對keychain也提供了豐富的開發(fā)文檔說明,包括有Keychain?Services?Programming?Guide:文章中包含了使用mac和ios的keychain開發(fā),首先介紹的是keychain的基本功能和概念,然后還有一個(gè)基本的例子介紹了基本的使用keychain?API的方法。在文章中還提到了Sample?Code:GenericKeyChain,是使用keychain的一個(gè)例子。
對于只需要保存用戶名和密碼的應(yīng)用來說,SSKeyChain可能更加適合,它對keychain做了相應(yīng)的封裝,接口相對來說更加簡單。文章介紹一個(gè)輕量級IOS框架:SSKeyChain中提到了github中的SSKeyChain,并且介紹了相應(yīng)的使用方法。github下的有相應(yīng)的源碼和簡介:SSKeyChain源碼。
按照說明可以將SSKeyChain的類文檔加入到xcode里面去,也可以直接進(jìn)行在線的查看。
4.對SSKeyChain中的password,service,account的理解和使用
既然說到要用SSKeyChain來保存用戶名和密碼,那么需要使用到的SSKeyChain的功能應(yīng)該就包括添加用戶名和密碼、刪除用戶名和密碼、查詢用戶名和密碼。
SSKeyChain的方法中涉及到的變量主要有三個(gè),分別如這一小節(jié)的標(biāo)題所示,是password、service、account。password、account分別保存的是密碼和用戶名信息。service保存的是服務(wù)的類型,就是用戶名和密碼是為什么應(yīng)用保存的一個(gè)標(biāo)志。比如一個(gè)用戶可以再不同的論壇中使用相同的用戶名和密碼,那么service保存的信息分別標(biāo)識不同的論壇。由于包名通常具有一定的唯一性,通常在程序中可以用包的名稱來作為service的標(biāo)識。
下面兩張圖分別展示了測試代碼和測試結(jié)果。setPassword的功能是保存account、service、password的,accoutsForService是提取對應(yīng)于特定service的所有accouts,從返回結(jié)果可以看出是返回結(jié)果是Array類型的,并且Array的每一個(gè)元素是以key-value格式保存的數(shù)據(jù)。如果需要找出特定的用戶名的話,需要使用valueForKey@“acct”來定位用戶名。(由于在這之前keychain已經(jīng)保存了一個(gè)數(shù)據(jù),所以lastObject對應(yīng)的下標(biāo)是2.)
在具體的使用過程中,根據(jù)需求,可以用在同一個(gè)service中保存多個(gè)用戶名和密碼,在需要提取的時(shí)候提取最后一個(gè),或者根據(jù)用戶名來提取特定密碼。也可以在同一個(gè)service中只保存一個(gè)用戶名和密碼,在需要保存新的用戶名和密碼的時(shí)候?qū)⒃瓉肀4娴拿艽a刪除。
在Xcode中安裝SSKeyChain的幫助文檔需要以下步驟:
打開菜單 Xcode -> Preferences
選擇 Downloads
選擇 Documentation
點(diǎn)擊底部的加號按鈕,并輸入以下URL: http://docs.samsoff.es/com.samsoffes.sskeychain.atom
點(diǎn)擊”SSKeyChain Documentation”旁邊的install按鈕。 (如果你看不到它,也沒有提示任何錯(cuò)誤,請重啟Xcode)
確保在Organizer中可選的docset中能夠看到SSKeychain。
此外,可以在線查看SSKeychain Documentation。
調(diào)試
如果無法保存鑰匙串,請使用SSKeychain.h中提供的錯(cuò)誤代碼,例如:
NSError *error = nil;
NSString *password = [SSKeychainpasswordForService:@"MyService" account:@"samsoffes"error:&error];
if ([error code] == SSKeychainErrorNotFound) {
NSLog(@"Passwordnot found");
}
顯然,你對做這個(gè)應(yīng)該很熟悉了。訪問鑰匙串是件痛苦的事情,你要隨時(shí)檢查它的每個(gè)錯(cuò)誤和失敗。SSKeychain并沒有使它(鑰匙串)變得更穩(wěn)定,它僅僅是繁瑣的C APIs封裝。
示例代碼
保存一個(gè)UUID字符串到鑰匙串:
CFUUIDRef uuid = CFUUIDCreate(NULL);assert(uuid != NULL);CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid);
[SSKeychain setPassword: [NSString stringWithFormat:@"%@", uuidStr]
forService:@"com.yourapp.yourcompany"account:@"user"];
然后,從鑰匙串讀取UUID:
NSString *retrieveuuid = [SSKeychainpasswordForService:@"com.yourapp.yourcompany"account:@"user"];
注意: setPassword和passwordForSevice方法中的services 和 accounts 參數(shù)應(yīng)該是一致的。