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

1.keychain的功能php

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

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

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

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

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

     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的一個例子。app

     對於只須要保存用戶名和密碼的應用來講,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的幫助文檔須要如下步驟:

  1. 打開菜單 Xcode -> Preferences
  2. 選擇 Downloads
  3. 選擇 Documentation
  4. 點擊底部的加號按鈕,並輸入如下URL: http://docs.samsoff.es/com.samsoffes.sskeychain.atom
  5. 點擊」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 參數應該是一致的。

相關文章
相關標籤/搜索