
「資料保護」的 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 是同一個 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 執行備份和同步,讓用户無須輸入密碼,還允許裝置管理服務遙距清除用户密碼。此 Keybag 儲存在用於透過 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 鑰匙圈」所需的備份鑰匙圈。