我是前言:
最近在專案中需要使用鑰匙串來進行賬戶密碼的儲存,小結一下。貼上框架地址:https://github.com/soffes/SAMKeychain。
它提供了5個類方法使用:
+ (NSArray *)allAccounts;
+ (NSArray *)accountsForService:(NSString *)serviceName;
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;
+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;
+ (void)setAccessibilityType:(CFTypeRef)accessibilityType;
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;
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/,主要的區別是你的應用在解除安裝之後userdefaults檔案將被系統刪除,但是鑰匙串不會,當你再次安裝應用到手機上,就可以直接讀取到之前儲存的資料了,當有這個需求的時候可以直接使用鑰匙串儲存,而且它的安全性更高。
3.SSKeyChain中的password,service,account的理解和使用
既然說到要用SSKeyChain來儲存使用者名稱和密碼,那麼需要使用到的SSKeyChain的功能應該就包括新增使用者名稱和密碼、刪除使用者名稱和密碼、查詢使用者名稱和密碼。
SSKeyChain的方法中涉及到的變數主要有三個,分別如這一小節的標題所示,是password、service、account。 password、account分別儲存的是密碼和使用者名稱資訊。service儲存的是服務的型別,就是使用者名稱和密碼是為什麼應用儲存的一個標誌。比如 一個使用者可以再不同的論壇中使用相同的使用者名稱和密碼,那麼service儲存的資訊分別標識不同的論壇。由於包名通常具有一定的唯一性,通常在程式中那個sever一般寫你的app的bundleID的名稱來作為service的標識。
下面兩張圖分別展示了測試程式碼和測試結果。setPassword的功能是儲存account、service、password 的,accoutsForService是提取對應於特定service的所有accouts,從返回結果可以看出是返回結果是Array型別的,並且 Array的每一個元素是以key-value格式儲存的資料。如果需要找出特定的使用者名稱的話,需要使用valueForKey@“acct”來定位使用者 名。(由於在這之前keychain已經儲存了一個資料,所以lastObject對應的下標是2.)
在具體的使用過程中,根據需求,可以用在同一個service中儲存多個使用者名稱和密碼,在需要提取的時候提取最後一個,或者根據使用者名稱來提取特 定密碼。也可以在同一個service中只儲存一個使用者名稱和密碼,在需要儲存新的使用者名稱和密碼的時候將原來儲存的密碼刪除。
4.輕量級使用:
5.除錯
如果無法儲存鑰匙串,請使用SSKeychain.h中提供的錯誤程式碼,例如:
NSError *error = nil;
NSString *password = [SSKeychainpasswordForService:@"MyService" account:@"samsoffes"error:&error];
if ([error code] == SSKeychainErrorNotFound) {
NSLog(@"Passwordnot found");
}