日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 钥匙串的基本使用

發布時間:2023/11/29 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 钥匙串的基本使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

級別: ★☆☆☆☆
標簽:「鑰匙串」「keychain」「iOS」
作者:?WYW
審校: QiShare團隊


前言 :
項目中有時會需要存儲敏感信息(如密碼、密鑰等),蘋果官方提供了一種存儲機制--鑰匙串(keychain)。
keychain是一種存儲在硬盤上的加密的數據庫。這個可能是卸載App后,keychain信息還在的原因。
keychain適合存儲 較小的數據量(不超過上千字節或上兆字節)的內容。
筆者做了一個關于keychain的增、刪、改、查的Demo(QiKeychain),給大家介紹下keychain的基本使用。

下圖(確保keychain中用戶的信息安全)有利于我們直觀了解keychain。

Demo(QiKeychain)解讀:

筆者用Demo(QiKeychain)做了4件事。

  • 增加:存儲用戶名、密碼到keychain;
  • 查詢:根據用戶名從keychain中查詢密碼;
  • 刪除:從keychain中刪除用戶名、密碼等相應信息;
  • 修改:修改keychain中的用戶名對應的密碼;

Demo(QiKeychain)對keychain的操作效果如下:

  • 存儲用戶名 “QiShare”,密碼:1234;
  • 查詢用戶名為“QiShare”的密碼,顯示密碼為:1234;
  • 修改用戶名“QiShare”的密碼為“123456”;
  • 查詢“QiShare”的密碼,顯示為“123456”;
  • 把“QiShare”從keychain中刪除。

keychain基本使用API

keychain有四個常用的API,用于增、刪、改、查keychain中的數據。
keychain中的數據子項是以item的形式存在的。
舉個例子:就存儲用戶名、密碼的情景來說,每個item包含存儲的用戶名和密碼及其他屬性信息,keychain中包含多個用戶名和密碼的item。

下圖(把數據和屬性存儲到keychain中)利于我們理解存儲過程

SecItemAdd:添加一個item或多個items到keychain
OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef * __nullable CF_RETURNS_RETAINED result)API_AVAILABLE(macos(10.6), ios(2.0)); 復制代碼

存儲關鍵代碼:

NSDictionary *saveSecItems = @{(id)kSecClass: (id)kSecClassGenericPassword,(id)kSecAttrService: service,(id)kSecAttrAccount: account,(id)kSecValueData: passwordData};OSStatus saveStatus = SecItemAdd((CFDictionaryRef)saveSecItems, NULL); 復制代碼
SecItemCopyMatching:返回匹配搜索查詢的一個item或多個items
OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_RETAINED result)API_AVAILABLE(macos(10.6), ios(2.0)); 復制代碼

查詢關鍵代碼:

NSDictionary *matchSecItems = @{(id)kSecClass: (id)kSecClassGenericPassword,(id)kSecAttrService: service,(id)kSecAttrAccount: account,(id)kSecMatchLimit: (id)kSecMatchLimitOne,(id)kSecReturnData: @(YES)};CFTypeRef dataRef = nil;OSStatus errorCode = SecItemCopyMatching((CFDictionaryRef)matchSecItems, (CFTypeRef *)&dataRef); 復制代碼
SecItemUpdate:修改匹配搜索查詢的一個item或多個items
OSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate)API_AVAILABLE(macos(10.6), ios(2.0)); 復制代碼

注意:更新代碼這部分,筆者開始的時候遇到一些問題,還要多謝組內成員,尤其是昆哥的指教。
SecItemUpdate接收了2個參數,query和attributesToUpdate。
第一個參數query用于查詢到相應的item, 第二個參數attributesToUpdate用于傳入要更新的信息。
筆者曾錯誤地給第二個參數attributesToUpdate傳入過(id)kSecClass: (id)kSecClassGenericPassword要更改的內容。
結果報錯為:
errSecNoSuchAttr = -25303, /* The specified attribute does not exist. */

更新關鍵代碼:

NSDictionary *queryItems = @{(id)kSecClass: (id)kSecClassGenericPassword,(id)kSecAttrService: service,(id)kSecAttrAccount: account};NSData *passwordData = [password dataUsingEncoding:NSUTF8StringEncoding];NSDictionary *updatedItems = @{(id)kSecValueData: passwordData,};OSStatus updateStatus = SecItemUpdate((CFDictionaryRef)queryItems, (CFDictionaryRef)updatedItems); 復制代碼
SecItemDelete:刪除匹配搜索查詢的一個item或多個items
OSStatus SecItemDelete(CFDictionaryRef query)API_AVAILABLE(macos(10.6), ios(2.0)); 復制代碼

刪除關鍵代碼:

NSDictionary *deleteSecItems = @{(id)kSecClass: (id)kSecClassGenericPassword,(id)kSecAttrService: service,(id)kSecAttrAccount: account};OSStatus errorCode = SecItemDelete((CFDictionaryRef)deleteSecItems); 復制代碼
顯然keychain的增刪改查相關的API都需要設置相應的屬性字典(分別代指上述的saveSecItems 、matchSecItems 、queryItems 、updatedItems 、deleteSecItems)
  • 屬性字典的key、value常用的有:(這部分內容讀者也可直接看文檔)
  • (id)kSecClass: (id)kSecClassGenericPassword kSecClass表示item的class (id)kSecClass的值表明一個通用的密碼item筆者一般都傳入kSecClassGenericPassword
  • (id)kSecAttrService: service kSecAttrService的value用于表明item的service
  • (id)kSecAttrAccount: account (id)kSecAttrAccoun的值表明item的帳戶名
  • (id)kSecValueData: passwordData (id)kSecValueData表示item的數據
  • (id)kSecMatchLimit: (id)kSecMatchLimitOne, (id)kSecMatchLimit 有2個值(id)kSecMatchLimitOne、和(id)kSecMatchLimitAll kSecMatchLimitOne:表示只匹配第一個符合條件的item kSecMatchLimitAll:表示匹配不限數量的items
  • (id)kSecReturnData: @(YES) (id)kSecReturnData的值是一個Boolean類型的值用于確定是否返回item data
  • kSecClass的值表示item的class kSecClass的值表明一個通用的密碼item筆者一般都傳入的kSecClassGenericPassword
  • kSecClass的值表示item的class kSecClass的值表明一個通用的密碼item筆者一般都傳入的kSecClassGenericPassword

Demo(QiKeychain)相關代碼

在Demo(QiKeychain)中,筆者對keychain相關使用的API進行了封裝。獲取Demo(QiKeychain)GitHub地址:QiKeychain。

注意:筆者后來封裝的代碼,修改了保存操作的邏輯。

修改內容為:在保存用戶名密碼的時候
-> 先在keychain中查詢用戶名是否存在
-> 若存在,就進行更新操作;
-> 若不存在就進行保存操作。

相應示意圖(使用鑰匙串存儲網絡密碼)如下:

參考學習地址

  • Keychain Services
  • SAMKeychain

小編微信:可加并拉入《QiShare技術交流群》。

關注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)

推薦文章:
iOS 自定義拖拽式控件:QiDragView
iOS 自定義卡片式控件:QiCardView
iOS Wireshark抓包
iOS Charles抓包
初探TCP
IP、UDP初探
奇舞周刊

總結

以上是生活随笔為你收集整理的iOS 钥匙串的基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。