Keychain : 在設備上安全存儲少量數據的機制, 比如密碼、密鑰、證書和身份信息等
Keychain 并不適合于通用目的的加密和數據存儲, 而是用來存儲需要保護的信息, 比如密碼與私鑰就會以加密的形式存儲起來. 諸如證書(不需要這種級別的保護)等就不會加密存儲
iOS 中, 每個應用都可以訪問它所創建的 Keychain 條目而無須請求許可
傳統的 Mac 開發, 可以訪問用戶同意的任何 Keychain 條目從技術上來說, Keychain 數據存儲在應用沙箱之外, 這樣就可以通過應用委托事件來持久化數據了. iOS Keychain 的權限依賴于用于簽名應用的配置文件. 當應用在其版本的生命周期中不斷演進時, 你需要一直使用相同的配置文件
應用的 Keychain 可以包含任意數量的條目, 每個條目都包含待存儲的數據及屬性. 每個 Keychain 條目的屬性都依賴于在存儲過程中選擇的條目類. 條目類之間存在很多通用的條目屬性.
在創建過程中, 有兩個重要的屬性需要注意(對于所有類都是一樣的), 它們是 kSecAttrAccessible 與 kSecAttrAccessGroup. 可以通過 kSecAttrAccessible 判斷應用何時能夠訪問 Keychain 條目. 你應用使用讓應用能夠滿足其目的的最嚴格的選項. 表 6-4 列出了 kSecAttrAccessible 屬性的所有可能值. 最低限度上, 你應用考慮將 kSecAttrAccessible 設為以 ThisDeviceOnly 結尾的值, 這樣就限制 Keychain 條目不能傳給新的設備. kSecAttrAccessGroup 表示 Keychain 條目屬于哪個訪問組. 應用可以屬于多個訪問組, 你在第 11 章定義的 Entitlements.plist 文件中將會看到這一點. 多個訪問組可以進一步劃分 Keychain 數據. 訪問組還可以用于在應用間共享數據. 第 11 章的示例將會詳細介紹這一點, 包括 Entitlements.plist 文件
Generic Password 類是安全存儲非 Internet 密碼的理想位置, 比如本章的服務層使用的認證令牌等. Generic Password 類也可以用于存儲檢測應用之前是否安裝過的指示器
在 Keychain 中創建條目時, 最佳實踐是首先判斷條目是否已經存在, 然后根據結果進行添加或更新. 其余動作(檢索、更新與刪除)都接收一個查詢參數, 它是 CFDictionaryRef 的一個實例. 動作會在與查詢匹配的每個 Keychain 條目上執行. 查詢參數可以是任意數量的條目屬性(表 6-3 中介紹的屬性的一個子集)與表 6-5 中定義的搜索屬性的組合
表 6-5 預定義的 Keychain 搜索屬性
第 11 章介紹如何將 Keychain 集成到應用中, 包括如何在多個應用間共享數據