運作方式

遠端控制,就是把 Mac 的螢幕和鍵盤交給另一台裝置。所以這一頁把 DuoDesk 如何配對、如何連線、如何加密,以及伺服器能看到什麼、做不到什麼,都講清楚,讓你自己判斷能不能信任它。

DuoDesk 的連線方式:iPhone 和 Mac 透過會合服務交換連線資訊,再直接建立 QUIC 加密連線;直連不通時,由 Cloudflare TURN 中繼轉送加密資料。 會合服務 Cloudflare Workers · 只負責牽線 iPhone · DuoDesk 私鑰在 Secure Enclave Mac · DuoDesk Host 不開放連接埠 Cloudflare TURN 中繼 直連不通時才用 · 只見密文 QUIC · TLS 1.3 互相釘選公鑰 · 點對點直連 簽章的連線請求 僅出站連線 備用路徑 DuoDesk 的連線方式:iPhone 和 Mac 透過會合服務交換連線資訊,再直接建立 QUIC 加密連線;直連不通時,由 Cloudflare TURN 中繼轉送加密資料。 會合服務 Cloudflare Workers · 只負責牽線 iPhone · DuoDesk 私鑰在 Secure Enclave Mac · DuoDesk Host 不開放連接埠 QUIC · TLS 1.3 互相釘選公鑰 · 點對點直連 Cloudflare TURN 中繼 直連不通時才用 · 只見密文 簽章的連線請求 僅出站連線 備用路徑
會合服務只負責讓兩台裝置找到對方。畫面和輸入走 iPhone 與 Mac 之間的加密連線:能直連就直連,連不通才經 Cloudflare 中繼,中繼看到的也只是密文。

1. 配對:信任從 Mac 螢幕開始

  • 每台裝置都有自己的 P-256 金鑰對。iPhone 的私鑰在 Secure Enclave 裡產生,無法匯出;裝置不支援時存放在僅限本機的鑰匙圈。Mac 的私鑰存在只有你的使用者帳號能讀取的檔案裡。
  • Mac 的 ID 由它的公鑰算出(公鑰 SHA-256 的前 16 位元組)。會合服務要求 Mac 用私鑰簽章來證明身分,所以沒有人能搶先註冊或冒用這個 ID。
  • 配對行動條碼只顯示在 Mac 的螢幕上,裡面有 Mac 的 ID、Mac 公鑰的指紋,以及一個 32 位元組、5 分鐘內有效、只能使用一次的配對金鑰。
  • iPhone 掃描後,用配對金鑰對自己的公鑰指紋算出一個 HMAC-SHA256。這既證明它確實看到了行動條碼,又把證明和它的公鑰綁在一起,中途沒辦法換成別人的金鑰。Mac 核對無誤後記下這支手機的公鑰。
  • 從此兩邊只認對方的公鑰。沒有密碼,也沒有可以被撞庫的帳號;想加入一支新手機,必須有人站在 Mac 前面掃描行動條碼。

2. 每次連線都發生了什麼

  1. 先通過 Face ID。每次連線前,iPhone 都要先通過 Face ID 或裝置密碼驗證;App 在背景待了 5 分鐘以上,回來要重新驗證。
  2. 送出簽章的連線請求。iPhone 用 Secure Enclave 裡的私鑰簽署一個請求,內容包括時間戳記、亂數、一次性的連線憑據和自己的網路位址,經會合服務轉給 Mac。網路位址也在簽章範圍內,服務沒辦法把 Mac 引到別處。
  3. Mac 決定放不放行。Mac 只接受已配對的公鑰、2 分鐘以內的時間戳記和從未用過的亂數,以前的請求無法重放。驗證通過後,它才暫時開啟一個 UDP 連接埠;30 秒內沒有建立工作階段就關閉。
  4. 找一條路。兩邊同時嘗試區域網路直連、借助 STUN 打洞的網際網路直連,以及 Cloudflare TURN 中繼。0.6 秒內能直連就走直連,否則先用最早接通的那條,之後 10 秒內直連通了再切回直連。中繼憑據只在 Mac 放行後才簽發。
  5. 建立加密工作階段。路徑通了以後,雙方建立 QUIC 連線(TLS 1.3),互相出示憑證,並核對對方的公鑰就是配對時記下的那一把。對不上就立即中斷。
  6. 斷了自己接上。工作階段同時備著一條中繼路徑,主要路徑約 1 秒沒有回應就切換過去;換網路時 App 會自動重新連線,重新連線期間不會傳送你的操作。

3. 如果伺服器遭到入侵

我們是以「會合服務和中繼伺服器已經遭到入侵」為前提來設計的。加密和身分驗證只在 iPhone 和 Mac 之間進行,伺服器手上沒有任何能解開工作階段或冒充裝置的金鑰。

它做不到

  • 看到你的螢幕、輸入或剪貼板:工作階段採端對端加密,金鑰只在兩台裝置上。
  • 冒充你的 Mac 或 iPhone:兩邊都會核對配對時記下的公鑰。
  • 幫你的 Mac 配對一支新手機:配對需要只顯示在 Mac 螢幕上的一次性金鑰。
  • 重放以前的連線請求:每個請求都帶有時間戳記和一次性亂數。

它最多能做到

  • 讓連線失敗。
  • 知道哪個 IP 位址在什麼時候連線到哪台 Mac。
  • 在待機模式面板上顯示假的任務狀態:即時動態推播要經過服務傳給 Apple,推播金鑰也在服務裡。

平時服務具體能看到和保存什麼,請見隱私權政策。

4. 會合服務的界限

  • 服務執行在 Cloudflare Workers 上,每台 Mac 對應一個 Durable Object。Mac 只對外連線到服務,用私鑰簽章註冊;服務不需要、也拿不到任何配對金鑰或裝置私鑰。
  • 連線請求原封不動轉發給 Mac,服務只讀取其中的推播權杖這一項。
  • 中繼(TURN)憑據只在 Mac 接受連線後才簽發,12 小時後失效。
  • 推播中繼只放行即時動態推播:只能推給連線過這台 Mac 的手機(服務只存權杖的雜湊值),只能用這台 Mac 自己建立的頻道。推播金鑰只放在服務裡,不會隨 Mac App 一起發布。
  • 防濫用:每個 IP 每分鐘對同一台 Mac 最多發出 30 次連線請求;每台 Mac 同時最多 8 個待處理的連線;單則訊息最大 8 KB。

5. Mac 上的保護

  • 不在網際網路上開放連接埠。Mac 平時只有一條連到會合服務的對外連線。工作階段用的 QUIC 只監聽本機回送位址,對外的 UDP 連接埠只在驗證通過後暫時開啟。
  • 隱私螢幕。連線時,DuoDesk 把實體顯示器的 gamma 表設成全黑。gamma 在畫面合成之後才起作用,所以傳到手機的畫面不受影響;DuoDesk Host 結束或當機時 macOS 會自動恢復 gamma,螢幕不會一直黑著。
  • 中斷連線後鎖定、閒置自動中斷。中斷連線後可以立即鎖定 Mac,用的是和系統選單「鎖定螢幕」相同的介面;15 分鐘沒有操作會自動中斷連線。
  • 連線看得見。有人連線時選單列圖像會改變;每次連線、中斷連線和原因都記在 Mac 本機的連線記錄裡。
  • 簽署和公證。DuoDesk Host 以 Developer ID 簽署,經過 Apple 公證,並啟用 Hardened Runtime。它需要「輔助使用」權限來執行你的操作,這類 App 不能放進沙盒,所以不在 Mac App Store 上架,而是從本網站下載。

6. 畫面、輸入和實測數據

  • 畫面用 ScreenCaptureKit 擷取,最高 60 fps,畫面不變時不輸出影格;用 VideoToolbox 硬體編碼 H.264 或 HEVC,開啟低延遲位元率控制、不使用 B 影格,位元率隨網路狀況自動調整。
  • 可以讓 Mac 新建一個和手機螢幕解析度一致的虛擬顯示器,畫面 1:1 顯示,不縮放。
  • 指標在手機上立即畫出來,再和 Mac 核對,不用等網路來回;手機上以 120 Hz 更新。

實測

情境走的路徑往返延遲(中位數)傳輸量
Mac 在共享辦公空間的 Wi-Fi,iPhone 用 5G打洞直連,約 0.1 秒打通30 ms58 Mbps
兩台都在同一個共享辦公空間的 Wi-Fi(裝置之間互不相通)Cloudflare 中繼,約 1 秒後切換過去18 ms69 Mbps

2026 年 10 月在新加坡測得,測的是 DuoDesk 的傳輸層(QUIC 加上打洞或中繼)。畫面的預設位元率是 12 Mbps。實際效果取決於你的網路。

7. 已知限制

  • Mac 要保持登入,螢幕鎖定沒關係。開啟 FileVault 的 Mac 重新啟動後停在解鎖畫面,這時還沒有網路,任何遠端工具都連不上。
  • 連線基於 UDP,完全封鎖 UDP 的網路無法連線。
  • macOS 大約每 30 天會再確認一次螢幕錄影權限;畫面被擋住時,需要有人在 Mac 前按一下「允許」。
  • 會合服務能看到連線的後設資料(見第 3 節)。