
資料保護的 Keybag
在 iOS、iPadOS、macOS、tvOS、visionOS 和 watchOS 中,系統會收集檔案和鑰匙圈「資料保護」類別的密鑰,並在 Keybag 中進行管理。這些作業系統使用下列 Keybag:使用者、裝置、備份、託管和「iCloud 備份」。
使用者 Keybag
使用者 Keybag 是裝置一般操作中使用的封裝類別密鑰的儲存位置。例如,輸入密碼後,會從使用者 Keybag 中載入 NSFileProtectionComplete 並解除封裝。這是二進位屬性列表(.plist)檔案,儲存在「無保護」類別中。
在配備 A9 以前 SoC 的裝置上,.plist 檔案內容以密鑰(保存在可抹除儲存空間中)加密。為了對 Keybag 提供更高的安全性,使用者每次更改密碼時,系統都會清除並重新產生此密鑰。
在配備 A9 或後續晶片、S 系列以及 M 系列 SoC 的裝置(不包含 Mac 電腦),其 .plist 檔案中包含一個密鑰,用來指出該 Keybag 儲存在一個由「安全隔離區」控制的防重放值所保護的儲存區中。
對於 Mac 電腦而言,使用者的 Keybag 會儲存在其「鑰匙圈」檔案夾內一個以硬體 UUID 命名的檔案夾中。例如:
~/Library/Keychains/123ABCDE-45FG-67HI-8910-1JK234L56M78/user.kb
在具備「安全隔離區」的裝置上,「安全隔離區」會負責管理使用者 Keybag,並且可以被查詢以確認裝置的鎖定狀態。只有當使用者 Keybag 中的所有類別密鑰符合以下條件,系統才會回報裝置處於已解鎖狀態:
可存取
已成功解除封裝
裝置 Keybag
裝置 Keybag 用來儲存經過包裝的類別密鑰,這些密鑰會用於與裝置專屬資料相關的操作。
iOS、iPadOS 和 visionOS 不支援使用者專屬檔案系統內容的加密編譯分隔,這表示系統會使用來自裝置 Keybag 的類別密鑰來封裝檔案專屬密鑰。不過,鑰匙圈會使用來自使用者 Keybag 的類別密鑰來保護使用者鑰匙圈裡的項目。在針對單一使用者(預設設定)設定的 iPad 和 iPhone 裝置上,裝置 Keybag 和使用者 Keybag 是同一個,且受使用者的密碼保護。
【注意】在設定為「共享的 iPad」模式的 iPad 裝置上,有時需要在任何使用者登入之前就能存取認證資料,在這種情況下,便需要一個不受使用者密碼保護的 Keybag。
備份 Keybag
備份 Keybag 是在 Finder(macOS 10.15 或以上版本)或 iTunes(macOS 10.14 或較早版本)進行加密備份時製作,其儲存在裝置進行備份的電腦上。新 Keybag 是使用一組新的密鑰製作而成,備份的資料會以這些新密鑰來重新加密。如前所述,不可遷移的鑰匙圈項目仍會使用 UID 衍生的密鑰加以封裝,以使其可以回復到最初備份它們的裝置,但在其他裝置上則無法存取。
Keybag 受到密碼組保護,且執行了一千萬次密鑰衍生函數 PBKDF2 的反覆運算。雖然反覆運算的次數很多,但 Keybag 並未與特定裝置綁定,因此理論上可嘗試在多部電腦上對備份 Keybag 進行暴力密碼破解攻擊。而安全性夠高的密碼可以降低此威脅。
若使用者選擇不加密備份,那麼無論檔案屬於哪一種「資料保護」類別,檔案都不會加密,但鑰匙圈仍會使用 UID 衍生的密鑰獲得保護。這就是只有在設定備份密碼時,才能將鑰匙圈項目遷移到新裝置的原因。
託管 Keybag
託管 Keybag 用於透過 USB 和裝置管理服務來與 Finder 或 iTunes 同步。此 Keybag 可讓 Finder 或 iTunes 在不要求使用者輸入密碼的情況下執行備份和同步,還能讓裝置管理服務從遠端清除使用者密碼。它儲存在用來與 Finder 或 iTunes 進行同步的電腦,或者遠端管理裝置的裝置管理服務上。
託管 Keybag 改善了裝置同步期間的使用者體驗,此期間內可能需要存取所有類別的資料。當使用密碼鎖定的裝置首次連接到 Finder 或 iTunes 時,系統會提示使用者輸入密碼。然後,裝置會製作託管 Keybag,其中包含的類別密鑰與裝置上使用的完全相同,該 Keybag 由新產生的密鑰保護。系統會將託管 Keybag 與用於保護它的密鑰分割到裝置和主機或伺服器上,其資料則以「首次使用者認證前的保護」類別儲存在裝置上。這就是使用者重新啟動後首次使用 Finder 或 iTunes 進行備份之前,必須輸入裝置密碼的原因。
如果是進行無線(OTA)軟體更新,在一開始進行更新時,系統會提示使用者輸入密碼。這會用來安全地建立一次性解鎖代號,其會在更新後解鎖使用者 Keybag。若未輸入使用者的密碼,便無法產生此代號,且若使用者密碼有所更改,任何先前產生的代號都會失效。
不同的一次性解鎖代號分別適用於手動和自動軟體更新安裝情形。它們會使用「安全隔離區」中單純計數器目前值所衍生的密鑰、Keybag 的 UUID 和「安全隔離區」UID 來進行加密。
在 A9(或後續晶片)SoC 上,即時鎖定代號不再依賴計數器或「可抹除儲存空間」,而是受到由「安全隔離區」控制的反重放值保護。
手動軟體更新的一次性解鎖代號會在 20 分鐘後過期。在 iOS 13.1、iPadOS 13、visionOS 1 或以上版本中,代號儲存在受到「安全隔離區」保護的保存庫中。在 iOS 13 以前,此代號可從「安全隔離區」輸出,並寫入「可抹除儲存空間」中,或受到「安全隔離區」反重放機制保護。若裝置在 20 分鐘內未重新開機,規則計時器會遞增計數器。
當以下其中一種情況發生,而且系統偵測到有可用更新時,軟體更新將會自動執行:
已在 iOS 12 或以上版本中設定自動更新。
使用者在收到更新通知時選擇「稍後安裝」。
使用者輸入密碼後,系統會產生一次性解鎖代號,在「安全隔離區」中效力長達 16 小時。如果尚未執行更新,每次鎖定裝置時系統便會銷毀此一次性解鎖代號,並在每一次的後續解鎖時重新建立。每次解鎖都會重計 16 小時。16 小時過後,規則計時器將會使一次性解鎖代號失效。
「iCloud 備份」Keybag
「iCloud 備份」Keybag 與備份 Keybag 類似。此 Keybag 中的所有類別密鑰都是非對稱式的(與「未打開檔案的保護」資料保護類別一樣,使用 Curve25519)。非對稱式 Keybag 也用來保護復原「iCloud 鑰匙圈」所需的備份鑰匙圈。