SSKeychain在iOS中的原理和使用說明

1.keychain的功能

keychain,中文翻譯成鑰匙串,可以算作是Apple一切從用戶需求出發的一個例子吧。目前手機和電腦早已經不僅僅是打電話和上網這些功能了,個人電腦或者智能手機可以看作是一個人的特征的標識,手機或者電腦中保存了大量用戶所獨有的數據信息,每個人都應當關注自己信息的保密問題。去年CSDN網站被報到出用明文保存密碼,并且被黑客獲取,這也提醒著大家需要注意對密碼的管理。

Apple應該很早就意識到了這樣的問題,不過keychain項目也是幾經波折才發展成現在這個樣子。目前keychain的主要功能就是幫助用戶安全地記住他的密碼,keychain保存的密碼文件都是經過加密的,其它人不能直接通過打開keychain的文件獲得保存在keychain中的密碼。在mac上可以安裝鑰匙串應用,一般情況下只有用戶正確輸入了mac系統的用戶名和密碼才能查看到用戶保存在keychain中的密碼。

Apple還提供了使用keychain保存密碼的API,如果應用程序使用了keychain?API來保存密碼,保存密碼的結果都可以在鑰匙串應用中查看到。Apple自帶的瀏覽器Safari就是用的keychain來保存密碼的,當用戶在一個網頁中輸入了用戶名和密碼之后,Safari會詢問用戶是否需要記住密碼。如果用戶選擇記住Safari則會采用keychain進行密碼的保存,在下次用戶再次訪問同一個網站的時候,系統會自動進行用戶名和密碼的填充。同時在鑰匙串程序中,可以看到Safari保存的針對特定網頁的用戶名,在輸入了系統登錄密碼之后可以查看到對應的密碼明文。

2.iOS中使用keychain和userdefaults保存數據的對比

userdefault適合保存一些輕量級的數據,使用userdefault保存的數據加載的時候要快一些,數據以明文的形式保存在.plist文件中,不適合用來保存密碼信息。文件的位置是Library/Application?Support/iPhone?Simulator/模擬器版本/Applications/應用對應的數字/Library/Preference/.plist文件

keychain采用的是將數據加密之后再保存到本地的,這樣對數據而言有更高的安全性,適合保存密碼之類的數據。數據保存的目錄是Library/Application?Support/iPhone?Simulator/模擬器版本/Library/Keychains/

3.SSKeychain的使用

Apple針對keychain也提供了豐富的開發文檔說明,包括有Keychain?Services?Programming?Guide:文章中包含了使用mac和ios的keychain開發,首先介紹的是keychain的基本功能和概念,然后還有一個基本的例子介紹了基本的使用keychain?API的方法。在文章中還提到了Sample?Code:GenericKeyChain,是使用keychain的一個例子。

對于只需要保存用戶名和密碼的應用來說,SSKeyChain可能更加適合,它對keychain做了相應的封裝,接口相對來說更加簡單。文章介紹一個輕量級IOS框架:SSKeyChain中提到了github中的SSKeyChain,并且介紹了相應的使用方法。github下的有相應的源碼和簡介:SSKeyChain源碼

按照說明可以將SSKeyChain的類文檔加入到xcode里面去,也可以直接進行在線的查看

4.對SSKeyChain中的password,service,account的理解和使用

既然說到要用SSKeyChain來保存用戶名和密碼,那么需要使用到的SSKeyChain的功能應該就包括添加用戶名和密碼、刪除用戶名和密碼、查詢用戶名和密碼。

SSKeyChain的方法中涉及到的變量主要有三個,分別如這一小節的標題所示,是password、service、account。password、account分別保存的是密碼和用戶名信息。service保存的是服務的類型,就是用戶名和密碼是為什么應用保存的一個標志。比如一個用戶可以再不同的論壇中使用相同的用戶名和密碼,那么service保存的信息分別標識不同的論壇。由于包名通常具有一定的唯一性,通常在程序中可以用包的名稱來作為service的標識。

下面兩張圖分別展示了測試代碼和測試結果。setPassword的功能是保存account、service、password的,accoutsForService是提取對應于特定service的所有accouts,從返回結果可以看出是返回結果是Array類型的,并且Array的每一個元素是以key-value格式保存的數據。如果需要找出特定的用戶名的話,需要使用valueForKey@“acct”來定位用戶名。(由于在這之前keychain已經保存了一個數據,所以lastObject對應的下標是2.)

在具體的使用過程中,根據需求,可以用在同一個service中保存多個用戶名和密碼,在需要提取的時候提取最后一個,或者根據用戶名來提取特定密碼。也可以在同一個service中只保存一個用戶名和密碼,在需要保存新的用戶名和密碼的時候將原來保存的密碼刪除。

在Xcode中安裝SSKeyChain的幫助文檔需要以下步驟:

打開菜單 Xcode -> Preferences

選擇 Downloads

選擇 Documentation

點擊底部的加號按鈕,并輸入以下URL: http://docs.samsoff.es/com.samsoffes.sskeychain.atom

點擊”SSKeyChain Documentation”旁邊的install按鈕。 (如果你看不到它,也沒有提示任何錯誤,請重啟Xcode)

確保在Organizer中可選的docset中能夠看到SSKeychain。

此外,可以在線查看SSKeychain Documentation。

調試

如果無法保存鑰匙串,請使用SSKeychain.h中提供的錯誤代碼,例如:

NSError *error = nil;

NSString *password = [SSKeychainpasswordForService:@"MyService" account:@"samsoffes"error:&error];

if ([error code] == SSKeychainErrorNotFound) {

NSLog(@"Passwordnot found");

}

顯然,你對做這個應該很熟悉了。訪問鑰匙串是件痛苦的事情,你要隨時檢查它的每個錯誤和失敗。SSKeychain并沒有使它(鑰匙串)變得更穩定,它僅僅是繁瑣的C APIs封裝。

示例代碼

保存一個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 參數應該是一致的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容