iOS之keychain的使用

2021-07-05 22:29:54 字數 2512 閱讀 4651

一、keychain 基礎

根據蘋果的介紹,ios裝置中的keychain是乙個安全的儲存容器,可以用來為不同應用儲存敏感資訊比如使用者名稱,密碼,網路密碼,認證令牌。蘋果自己用keychain來儲存wi-fi網路密碼,vpn憑證等等。

它是乙個sqlite資料庫,位於/private/var/keychains/keychain-2.db,其儲存的所有資料都是加密過的。

開發者通常會希望能夠利用作業系統提供的功能來儲存憑證(credentials)而不是把它們(憑證)儲存到nsuserdefaults,plist檔案等地方。儲存這些資料的原因是開發者不想使用者每次都要登入,因此會把認證資訊儲存到裝置上的某個地方並且在使用者再次開啟應用的時候用這些資料自動登入。

識別符號(identifier)在後面我們要從keychain中取資料的時候會用到。如果你想要在應用之間共享資訊,那麼你需要指定訪問組(access group)。有同樣的訪問組 的應用能夠訪問同樣的keychain資訊。

要把資訊儲存到keychain中,使用 setobject:forkey: 方法。在這裡, (id)ksecattraccount 是乙個預先定義好的鍵(key),我們可以用它來儲存賬號名稱。 ksecclass指定了我們要儲存的某類資訊,在這裡是乙個通用的密碼。ksecvaluedata可以被用來儲存任意的資料,在這裡是乙個密碼。

ksecattraccessiblein變數用來指定這個應用合適需要訪問這個資料。我們需要對這個選項特別注意,並且使用最嚴格的選項。這個鍵(key)可以設定6種值。

當然,我們應該絕對不要使用ksecattraccessiblealways。乙個安全點的選項是ksecattraccessiblewhenunlocked。有些選項是以 thisdeviceonly 結尾的,如果選中了這個選項,那麼資料就會被以硬體相關的金鑰(key)加密,因此不能被傳輸到或者被其他裝置看到。即使它們提供了進一步的安全性,使用它們可能不是乙個好主意,除非你有乙個更好的理由不允許資料在備份之間遷移。

鑰匙串中的條目都有幾個可搜尋的**屬性**和乙個加密過的**值**。對於通用密碼條目,比較重要的屬性有賬戶(ksecattraccount)、服務(ksecattrservice)和識別符號(ksecattrgeneric)。而值通常是密碼。

說明:

每乙個keychain的組成如圖,整體是乙個字典結構.

1.ksecclass key 定義屬於那一種型別的keychain

2.不同的型別包含不同的attributes,這些attributes定義了這個item的具體資訊

3.每個item可以包含乙個密碼項來儲存對應的密碼

安全性:

從keychain中匯出資料的最流行工具是ptoomey3的keychain dumper。其github位址位於

此keychain-viewer

就使用如下的entitlements.

雖然keychain也容易被破解,不過比nsuserdefaults和plist安全得多,只要我們注意不要在keychain中儲存明文密碼就會在很大程度上提公升安全性。 二、

keychain操作

ios中security.framework框架提供了四個主要的方法來操作keychain:

// 查詢

osstatus secitemcopymatching(cfdictionaryref query, cftyperef *result);

// 新增

osstatus secitemadd(cfdictionaryref attributes, cftyperef *result);

// 更新

keychain中的itemosstatus secitemupdate(cfdictionaryref query, cfdictionaryref attributestoupdate);

// 刪除

keychain中的itemosstatus secitemdelete(cfdictionaryref query)

三、

keychain使用

引入security包,引入檔案 #import

新增

- (ibaction)add:()sender 

}

查詢

- (ibaction)sel:()sender 

- (ibaction)sname:()sender }}

}

修改

- (ibaction)update:()sender 

}

注意:

1.區別(標識)乙個item要用ksecattraccount和ksecattrservice

demo:儲存密碼

需要匯入security.framework 

iOS 之keychain詳解(附有Demo)

ios keychain共有5種型別 ksecclassgenericpassword ksecclassinternetpassword ksecclasscertificate ksecclasskey ksecclassidentity 這五種型別分別有不同的屬性,你可以理解為資料中5個不同的...

iOS獲取UUID,並使用keychain儲存

udid被棄用,使用uuid來作為裝置的唯一標識。獲取到uuid後,如果用nsuserdefaults儲存,當程式被解除安裝後重灌時,再獲得的uuid和之前就不同了。使用keychain儲存可以保證 程式給大家兩個類 uuid.h中的 import 尖括號 foundation foundation...

Keychain的簡單使用

一 簡介 二 基礎使用方法 增 secitemadd cfdictionaryref attributes,cftyperef result 增加乙個或多個條目到keychain,注意引數使用時需要將core foundation物件轉換成objective c型別物件使用 bridge trans...