iOS 之keychain詳解(附有Demo)

2022-08-04 00:03:12 字數 3948 閱讀 6238

ios keychain共有5種型別: ksecclassgenericpassword、ksecclassinternetpassword、ksecclasscertificate、ksecclasskey、ksecclassidentity

這五種型別分別有不同的屬性,你可以理解為資料中5個不同的表,他們有各自對應的字段,因此對應的它們的增刪改查其實有點類似於sql語句的操作,下面是不同型別對應的屬性:

現在以ksecclassgenericpassword(一般的密碼)為例:

增加keychain

//

新增keychain

- (void

)addkeychainpassword;

/*引數一:

ksecattraccessiblewhenunlocked 表示獲取當前金鑰只要螢幕處於解鎖狀態就可以了

ksecattraccessibleafterfirstunlock 表示手機第一次解鎖就可以獲取當前金鑰

ksecattraccessiblealways 表示任何時候都可以獲取當前金鑰

ksecattraccessiblewhenpasscodesetthisdeviceonly 表示獲取金鑰只能在當前裝置,把手機資料恢復到新的手機中是不可用的

ksecattraccessiblewhenunlockedthisdeviceonly 非鎖定狀態,且裝置唯一指定,同上

ksecattraccessibleafterfirstunlockthisdeviceonly 第一次解鎖,且裝置唯一指定,同上

ksecattraccessiblealwaysthisdeviceonly 總是可以獲取,當然也是裝置唯一指定,同上

引數二:

ksecclassgenericpassword 為keychain型別

引數三:

ksecvaluedata 儲存的資料,就是密碼、token儲存的地方,要轉化為nsdata型別

引數四:

ksecattraccount 為賬戶名 作為賬戶密碼的唯一索引

引數五:

ksecattrservice 為服務名 作為賬戶密碼的唯一索引

*/cftyperef result;

osstatus status = secitemadd((__bridge cfdictionaryref)query, &result);

if (status ==errsecsuccess)

else

}

查詢keychain:

//

查詢keychain

- (void

)querykeychainpassword;

//ksecmatchlimitone 表示查詢返回一條記錄,有可能查到多條記錄,一般預設返回一條記錄

//ksecmatchlimitall 表示返回所有記錄

//secitemcopymatching函式會根據query裡面的查詢條件查詢對應符合要求的記錄,另外根據不同的keychain型別datatyperef會返回對應的不同型別如nsarray、nsdictionary、nsdata

cftyperef datatyperef =null;

osstatus status = secitemcopymatching((__bridge cfdictionaryref)query, &datatyperef);

if (status ==errsecsuccess)

}

查詢keychain對應的屬性:

//

另外可以通過ksecreturnref查詢其他屬性,相對於前面的返回金鑰的引用,ksecreturnref返回的是keychain所有的屬性

- (void

)querymoreattribute;

cftyperef datatyperef =null;

//重點是(__bridge id)ksecreturnref:@yes,宣告返回的資料是整個keychain的所有屬性

osstatus status = secitemcopymatching((__bridge cfdictionaryref)query, &datatyperef);

if (status ==errsecsuccess)

}

更新keychain:

//

修改keychain

- (void

)changekeychainpassword;

nsdictionary *update = @;

osstatus status =secitemupdate((__bridge cfdictionaryref)query, (__bridge cfdictionaryref)update);

if (status ==errsecsuccess)

}

刪除keychain:

//

刪除keychain

- (void

)deletekeychainpassword;

//盡量詳細的新增多個屬性,避免誤刪其他keychain

osstatus status =secitemdelete((__bridge cfdictionaryref)query);

if (status ==errsecsuccess)

}

ios  keychain有乙個特色功能就是keychainsharing,它能實現多個同乙個開發者賬號下的多個應用共享keychain,前提是要開啟keychainsharing功能,如下圖所示:

可以在keychainsharing中對應的分組,把keychain新增的到分組的操作可以這樣寫

//

sharing items

//新增sharing items

- (void

)addsharingitems;

/*(__bridge id)ksecattrsynchronizable : @yes 表示可以同步到icloud,如果要同步到其他裝置,請注意避免使用deviceonly設定等其他和裝置唯一性相關的設定

*/osstatus status =secitemadd((__bridge cfdictionaryref)query, nil);

if (status ==errsecsuccess)

else

}

查詢對應的分組

//

查詢sharing items

- (void

)querysharingitems;

cftyperef datatyperef =null;

osstatus status = secitemcopymatching((__bridge cfdictionaryref)query, &datatyperef);

if (status ==errsecsuccess)

else

}

和對單個keychain進行操作不同的是新增多了乙個ksecattraccessgroup屬性,用於指明對應的分組,這裡要注意的是要新增開發者賬號的teamid,用於區分不同的開發者。

如果都是自己定義屬性進行增刪改查的操作,是比較容易出bug的,而且操作也比較繁瑣,畢竟這些操作都是基於c語言的api操作。下面介紹乙個簡單的輕量級框架sskeychain來實現我們對金鑰的增刪改查,閒話少說,直接上**:

- (void

)viewdidload

else

}

最後附上本文demo:

iOS之keychain的使用

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

iOS獲取UUID,並使用keychain儲存

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

iOS開發 用keychain替代UDID

從2013 5 1日開始蘋果就禁止對uuid的應用的通過了。所以我們需要用一些辦法替換,下面我就是用keychain的訪問替換掉uuid的。那麼,關於keychain的應用,apple提供了乙個叫generickeychain的例子程式,在這裡 其中封裝了乙個簡化keychain操作的類 keych...