无需账户的配对:Peering 如何决定信任谁
大多数远程桌面工具都要你注册,好让一家公司来判断两台设备是否属于同一个人。Peering 跳过了公司,直接问你,用六位数字。
每台设备就是它自己的身份
Peering 第一次在 Mac 或 iPhone 上运行时,会生成一对 P-256 密钥,并把私钥保存在该设备的 Keychain 中。 这个密钥就是设备永久的身份。没有用户名,没有密码,也没有任何服务器保存副本。 每次应用启动时,它都会用这个密钥签发一份新的自签名证书,其他设备固定的是密钥,而不是证书。
这一点很重要,因为自签名证书本身什么也证明不了。它只是说“这个密钥生成了这份证书”, 而不是“这是你客厅里的那台 Mac”。必须有某种东西把密钥和一台实际的设备联系起来,而这个东西就是你。
六位数字
手机第一次与 Mac 相遇时,两个屏幕都会显示一个六位数字代码。你确认它们一致。 如果一致,每台设备就会保存对方的密钥。如果不一致,说明有人夹在两者之间,你就拒绝。
这个代码不是随机的,也不是密码。它是对整个握手过程计算出的一个短哈希:双方的设备 ID、 各方新生成的一次性密钥、各方的一次性随机数,以及 Mac 的身份密钥。具体来说, 它是对这些字段做 SHA-256 后取前四个字节,再缩减为六位十进制数字。 如果攻击者转发这个连接,Mac 和手机各自看到的记录就不同,因此数字也不同。
为什么要先承诺
六位数字代码只有一百万种取值,所以聪明的攻击者可能会不断尝试一次性密钥, 直到双方碰巧显示相同的数字。协议通过“承诺再揭示”这一步堵住了这条路:
- 每一方先发送自己的一次性密钥和随机数的哈希。
- 只有在双方的哈希都到齐之后,任何一方才会揭示真实的值。
- 每一方都用之前收到的哈希来校验揭示的内容。
因为攻击者必须在看到任何东西之前就先承诺,所以无法调整自己的值去匹配。 剩下的只是盲猜,每次尝试得到匹配代码的概率是百万分之一, 而一次失败的尝试会表现为你能看到的不一致。
二维码捷径
如果你扫描 Mac 上的二维码,就没有什么需要肉眼比对的了。二维码中包含一个 16 字节的密钥, 只有看着 Mac 屏幕的人才可能拿到。手机用它计算出一个证明(对握手过程的 HMAC), Mac 则把它作为配对的人就在 Mac 面前的证据。没有这个证明,Mac 会请它自己的用户来批准。
配对之后,信任就是一次密钥比对
之后的每次连接都是一个 TLS 1.3 会话,双方都会出示自己的密钥。手机取的是它实际收到的证书里 Mac 的密钥, 绝不取 Mac 在消息中所说的任何内容,并以恒定时间与保存的密钥比较。密钥不同,就不会建立连接。 第一次之后,不会再向你询问任何事情。
如果某台 Mac 声称“我已经认识你了”,但你的手机并没有保存它的密钥,手机就会拒绝。 这种声明什么也证明不了,因为陌生人同样可以轻易这么说。
实际操作步骤见配对指南。至于连接建立之后会发生什么, 请参见中继能看到什么。
常见问题
Peering 需要账户或电子邮件地址吗?
不需要。每台设备都会创建自己的密钥,并存放在自己的 Keychain 中。配对就是在两个屏幕上比对的一个六位数字代码。
六位数字配对码能防范什么?
防范夹在你的 iPhone 和 Mac 之间的人。该代码由整个握手过程推导而来,所以中间人会在两个屏幕上产生不同的代码,你能看出不一致。