你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> iOS 中使用 Keychain Services 在應用間共享數據

iOS 中使用 Keychain Services 在應用間共享數據

編輯:IOS開發基礎

iOS 系統中,各個應用被限制在沙盒(sandbox)中運行。這樣的設計,應用的健壯性和安全性都得到了提高,但是,應用間共享信息就變得不那麼容易。在 iOS 3.0 之後,應用間共享數據成為了一種可能。但仍然是被嚴格限制的,只有擁有相同 App ID 前綴的應用才有可能通過 keychain service 共享簡單數據。通過這個工具,你可以安全地在一些的應用間共享用戶登錄憑據,從而免除用戶重復輸入的麻煩。

Keychain Services 基本概念

Keychain Services 是 OS X 和 iOS 都提供一種安全地存儲敏感信息的工具,比如,存儲用戶ID,密碼,和證書等。存儲這些信息可以免除用戶重復輸入用戶名和密碼的過程。Keychain Services 的安全機制保證了存儲這些敏感信息不會被竊取。簡單說來,Keychain 就是一個安全容器。

Keychain 的結構

Keychain 可以包含任意數量的 keychain item。每一個 keychain item 包含數據和一組屬性。對於需要保護的 keychain item,例如,密碼或者私鑰,數據是加密的,會被 keychain 保護起來的;對於無需保護的 keychain item,例如,證書,數據未被加密。

與 keychain item 聯系的屬性取決於 item 的類型。經常被使用到的 item 類型是 Internet passwords 和 generic passwords。如你期待的那樣,Internet passwords 包含了諸如安全域,協議類型,路徑之類的屬性。Passwords 以加密的形式存儲在 keychain item 中。在 OS X 中,當 keychain 被鎖之後,加密的 item 是不能訪問的。如果你試圖訪問一個被鎖住的 item,Keychain Services 將顯示一個對話框要求用戶輸入 keychain 的密碼。屬性是都不加密的,它們可以在任何時候被讀取,即使是在 keychain 被鎖住了的情況。在 iOS 中,應用總是可以訪問自己所擁有的 keychain items。

iOS 中的 Keychain Services

強調一下 iOS 中的狀況,應用總是可以訪問自己擁有的 keychain items,而不能訪問其他應用的 keychain item。系統將會為 keychain 生成密碼,並將密碼以任何應用都無法訪問的方式存儲。當一個用戶備份 iPhone 數據時,keychain 數據也會被備份,但是 keychain 中的敏感數據仍然是加密的。keychain 的密碼則不會被備份。因此,即使某人獲取了備份數據的訪問權限,他還是無法訪問存儲在 keychain 中的密碼和其他敏感信息。因此,使用 keychain 存儲敏感信息(密碼,cookie 等)是很安全的。

Keychain 的操作

  • SecItemCopyMatching

  • SecItemAdd

  • SecItemUpdate

  • SecItemDelete

SecItemCopyMatching 用於搜索。其他操作操作,SecItemAdd,SecItemUpdate,SecItemDelete 從字面上就能理解。具體的使用細節可以查看 Apple 的文檔:Apple Keychain Services Reference。

Apple 也提供了一個關於 Keychain 操作的封裝:KeychainItemWrapper。在 Xcode 的 Document 中可搜到此項目。

github 上也有一個使用起來稍微簡單一些的封裝:PDKeychainBindingsController。但 PDKeychainBindingsController 不支持 Access Group。這在後面講到的應用間共享 keychain 數據時需要用到,但是自己加上這個並不困難。

iOS 應用間共享 Keychain 數據

在 iOS 3.0 之後,應用間共享 keychain 數據成為了一種可能。但這是被嚴格限制的。只有擁有相同 App ID 前綴的應用才有可能共享 keychain。並且各應用存儲的 keychain item 都需要標記了相同的 kSecAccessGroup 字段值。

相同的 Team ID

有相同的 Team ID。這個是應用間共享 Keychain 數據的前提條件。一個 App ID 分兩部分:

  • Apple 為你生成的 Team ID;

  • 開發者注冊的 Bundle ID。

一個典型的 App ID 如:659823F3DC53.com.apple.oneappleapp。

659823F3DC53 即為你的 Team ID,是 Apple 為你生成的。一個開發者賬號可以有不同的幾個 Team ID。但 Apple 不會為不同的開發者生成一樣的 Team ID。這樣,不同的開發者賬號發布的應用想共享 keychain 數據,在現在來看是無法實現的。而要做到 keychain 數據共享,要求是同一個開發賬號開發的,同時選擇了相同的 Team ID。

1.png

在 Apple 的 iOS Dev Center 中,創建 App ID 時,選擇 Team ID 時,你會看到這樣提示:

If you are creating a suite of applications that will share the same Keychain access, use the same bundle Seed ID for each of your application's App IDs.

其中提到的 Seed ID 即這裡說的 Team ID。

com.apple.oneappleapp 即為你的 Bundle ID。 這個是由開發者決定的。

kSecAccessGroup

在存儲 keychain item 時,需要明確存入你的 access group:

[spec setObject:[[self class] accessGroup] forKey:(__bridge id)kSecAttrAccessGroup];

access group 字段存入這樣的 659823F3DC53.com.apple.account 字段。前面的一串字符:659823F3DC53 必須為 TEAM ID,後面字符串則可由開發者決定。

項目配置

你需要創建一個 plist 文件,可以是任何名稱,比如 Apple 的 demo 項目 KeychainItemWrapper 中,將其命名為 KeychainItemWrapper.plist 這個名字可能比較清楚。其內容應該如下圖所示:

1.png

然後需要在 Xcode 中配置這個文件的路徑。具體配置位置為:Project->Build setting->Code Signing Entitlements,填入這個文件的相對路徑,可以參考項目中已有的一個配置文件 plist 的位置來填寫。這個如果配置不好,是無法與其他應用共享 Keychain 的。配置好後,須用你正式的證書簽名編譯才可通過,否則 Xcode 會彈框告訴你 code signing 有問題。

參考文檔

Apple Keychain Services Reference


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved