Peering 的中继能看到什么,不能看到什么
中继是处在你远程桌面会话中间的一台服务器,所以该问的是:什么在阻止它偷看。答案是一把它永远收不到的密钥。
它做什么
中继承担三项工作。它为无法直接互通的两台设备做介绍;当它们仍然无法互通时,在两者之间复制字节; 它还会代 Mac 发送推送通知,例如“你的编程智能体需要回应”。它是一个小型的 Rust 程序, 让它的职责保持很小,正是设计所在。
它知道什么
坦率地说明这一点,本身就是重点之一。为了完成工作,中继会看到:
- 设备标识符和 Mac 的名称,这样它才能把一部手机匹配到一台 Mac。
- 每台设备连接时所用的网络地址,这和任何服务器一样,并且它会把各自的地址交给对方,好让它们尝试直连。
- 正在使用的套餐,以及已用掉多少中继时间,用来执行每天 30 分钟的免费额度。
- 会话存在这一事实、开始的时间和持续的时长。
隐私政策完整列出了这些内容。其中没有一项是你会话的内容。
它看不到什么
画面、声音、剪贴板、按键和指针,都在一条终止于你两台设备的加密通道之中。 中继无法读取、修改或重放它们。有两种机制保证了这一点,而且都不依赖于对中继的信任。
控制通道是设备之间的 TLS
当会话经由中继时,手机会通过中继与 Mac 进行 TLS 1.3 握手。中继只复制加密的记录而不终止它们, 所以它从不持有会话密钥。两端都用配对时固定下来的密钥进行认证, 因此中继无法让自己顶替进来,否则手机会拒绝这个连接。
视频密钥从不经过中继
视频走的是另一条路,经由 UDP,所以它需要自己的密钥。会话准备好之后, Mac 会生成 32 个随机字节,并在 TLS 流内部把它们发给手机。 中继承载这条流,却无法打开它。随后每个方向用 HKDF-SHA256 派生出各自的密钥, 每个数据报都用 ChaCha20-Poly1305 和一个计数器加密。
key = HKDF-SHA256(secret, salt = "pl.dmq.peering.video-datagram", info = direction) datagram = token | counter | ciphertext | tag
最前面那个 16 字节的令牌是中继唯一会读取的东西。它是一个路由提示,说明该数据报属于哪个会话, 中继在转发之前会把它去掉。它之后的一切都是密文。
推送通知与实时活动
当你的手机处于睡眠状态时,Mac 会请中继通过 Apple 推送来唤醒它。推送里放的内容刻意保持得很少: 提醒只有一个简短的标题和消息,而 Live Activity 的更新只包含编码后的状态,例如 ID、状态、数量和时间。 Mac 从不会把你的屏幕或终端输出发给中继。关于智能体的批准,请参见编程智能体通知。
用证明代替账户
免费额度总得附着在某样东西上。设备不使用账户,而是用自己的密钥为一条简短的消息签名, 中继在五分钟的时间窗口内校验这个签名。这样额度就绑定在一个密钥上,而不是一个可以重置的 ID 上, 而且任何人只要没有私钥,就无法冒充一台已注册的 Mac。
自己去验证
线路格式有文档记录,而中继围绕着一项约束来构建:它只负责介绍对端并复制加密的字节, 无法检查、更改或授权它所承载的内容。至于会话一开始是如何接入中继的,请阅读 你的 iPhone 如何随时随地连上 Mac, 而两端的密钥为何值得信任,请阅读无需账户的配对。
常见问题
Peering 的中继能看到我的屏幕吗?
不能。画面用一把密钥加密,这把密钥由 Mac 在一个中继无法打开的加密连接内发给手机,所以中继从头到尾只复制密文。
Peering 的中继知道关于我的什么?
设备标识符、你的 Mac 的名称、正在使用的套餐、中继用量,以及每台设备连接时所用的网络地址。它看不到视频、音频、按键或剪贴板内容。