工作原理

远程控制,就是把 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 节)。