Skip to content

身分與成員資格

bae 完全沒有帳號系統。裝置的身分是它為自己產生並保存在 OS 鑰匙圈中的 Ed25519 金鑰對;公開金鑰就是身分。誰屬於某個資料庫,是雲端主目錄中的一組簽署記錄,任何持有它們的人都可驗證,且不是由伺服器發出。這套機制來自 coven;本頁說明 bae 如何使用它。

每個擁有者會把僅附加的已簽署成員記錄流寫入雲端主目錄:此金鑰以此角色加入,此金鑰已移除。每個記錄都連到前一個,每個擁有者也會簽署一個頭部來宣告其流的末端,因此提供者若丟棄或重新排序記錄,會被偵測到而不是被相信。資料庫接受的是每個擁有者已驗證流的聯集。

每次拉取時,每個 changeset 的作者都會對照此記錄檢查:由目前成員簽署,且角色可寫入。來自已移除裝置、從未加入的金鑰,或簽章無效的 changeset 不會套用。提供者儲存記錄,但無法偽造它們;只有持有 owner 金鑰者能變更成員資格。

OwnerMember 都能讀寫資料庫;擁有者另外能核准與移除裝置。bae 的建立裝置是 owner,它核准的每台裝置都以 member 身分加入。(底層機制中還有第三個角色,即唯讀 follower,目前 bae 不會指派。)

加入裝置是兩個代碼的交換,中間有明確的人為驗證:

  1. 加入裝置產生其金鑰對並顯示 join request:公開金鑰、其短指紋,以及(對 OAuth 提供者)要分享資料夾的雲端帳號。
  2. 擁有者解碼請求,兩個畫面顯示相同指紋。人檢查它們相符;這一步會擋下被替換的金鑰。
  3. 核准同時做三件事:授予新加入者帳號對雲端主目錄的存取權(消費型雲端上的資料夾分享、S3 上的嵌入憑證、iCloud 上的 CloudKit share)、把資料庫金鑰封存給新加入者公開金鑰,並簽署加入它的成員記錄。所有內容會打包成 invite code
  4. 加入裝置消耗邀請、解封金鑰、從最新快照啟動,並同步。

邀請會封存給請求金鑰:攔截它不會取得任何權限。

移除成員會附加已簽署移除記錄,並把資料庫金鑰輪替到被移除金鑰永遠收不到的新世代(見加密)。在可撤銷存取權的儲存上,存取也會被收回。已同步到被移除裝置上的內容會留在那裡;資料無法被收回。輪替之後的一切都超出它的觸及範圍。

復原碼刻意繞過成員資格:它是雲端主目錄座標加上資料庫金鑰,放在一個 bearer 字串中,用於在沒有仍可核准者時還原你自己的資料庫。它依需求產生,在 Apple 平台上自動儲存在 iCloud Keychain 中,敏感度與資料庫本身完全相同。