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