Peering

Peering / 博客

Peering 的中继能看到什么,不能看到什么

中继是处在你远程桌面会话中间的一台服务器,所以该问的是:什么在阻止它偷看。答案是一把它永远收不到的密钥。

它做什么

中继承担三项工作。它为无法直接互通的两台设备做介绍;当它们仍然无法互通时,在两者之间复制字节; 它还会代 Mac 发送推送通知,例如“你的编程智能体需要回应”。它是一个小型的 Rust 程序, 让它的职责保持很小,正是设计所在。

它知道什么

坦率地说明这一点,本身就是重点之一。为了完成工作,中继会看到:

隐私政策完整列出了这些内容。其中没有一项是你会话的内容。

它看不到什么

画面、声音、剪贴板、按键和指针,都在一条终止于你两台设备的加密通道之中。 中继无法读取、修改或重放它们。有两种机制保证了这一点,而且都不依赖于对中继的信任。

控制通道是设备之间的 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 字节的令牌是中继唯一会读取的东西。它是一个路由提示,说明该数据报属于哪个会话, 中继在转发之前会把它去掉。它之后的一切都是密文。

iPhone 锁定屏幕上显示两条 Peering 通知:一个终端已完成,另一个终端需要批准。
推送通知只带有简短的文字和编码后的状态。你的屏幕绝不会成为其中的一部分。

推送通知与实时活动

当你的手机处于睡眠状态时,Mac 会请中继通过 Apple 推送来唤醒它。推送里放的内容刻意保持得很少: 提醒只有一个简短的标题和消息,而 Live Activity 的更新只包含编码后的状态,例如 ID、状态、数量和时间。 Mac 从不会把你的屏幕或终端输出发给中继。关于智能体的批准,请参见编程智能体通知。

用证明代替账户

免费额度总得附着在某样东西上。设备不使用账户,而是用自己的密钥为一条简短的消息签名, 中继在五分钟的时间窗口内校验这个签名。这样额度就绑定在一个密钥上,而不是一个可以重置的 ID 上, 而且任何人只要没有私钥,就无法冒充一台已注册的 Mac。

自己去验证

线路格式有文档记录,而中继围绕着一项约束来构建:它只负责介绍对端并复制加密的字节, 无法检查、更改或授权它所承载的内容。至于会话一开始是如何接入中继的,请阅读 你的 iPhone 如何随时随地连上 Mac, 而两端的密钥为何值得信任,请阅读无需账户的配对。

常见问题

Peering 的中继能看到我的屏幕吗?

不能。画面用一把密钥加密,这把密钥由 Mac 在一个中继无法打开的加密连接内发给手机,所以中继从头到尾只复制密文。

Peering 的中继知道关于我的什么?

设备标识符、你的 Mac 的名称、正在使用的套餐、中继用量,以及每台设备连接时所用的网络地址。它看不到视频、音频、按键或剪贴板内容。