BlindPost BlindPost ← 所有文章
English简体中文繁體中文

你的账号怎么换手机 —— 不经过我们的服务器

你买了一台新手机。你想把 messaging app 搬过去,带上聊天记录、联系人、群聊,所有东西

如果你用 WhatsApp:在新手机上装好 → 输手机号 → 收短信 → app 从 Meta 的服务器把你的账号历史(以及越来越多的端到端加密消息)拉下来。你的数据在迁移过程中绕了一遍第三方 —— 传输是加密的,但 metadata(什么时候上传、多大、是哪个账号)暴露,而那个加密 blob 在他们的云上停留你完成设置所需要的整段时间

如果你用 Signal:体验更友好一些 —— 扫 QR 码绑定新手机,新设备通过 Signal 的中继跟老设备认证。老消息默认不迁移;想要的话走另一个独立的备份-恢复流程,用一组单独生成的口令。

BlindPost 跟两者都不一样。你的新手机和老手机直接通过本地 Wi-Fi 连接,建立一条封死的端到端加密通道,它们之间互传你的账号材料我们的服务器全程看不到迁移这件事发生你的身份、密钥、聊天历史,没有任何一字节经过我们的基础设施

下面讲讲这是怎么做到的。

数据走的那条路

  1. 同一个网络。两台手机要在同一局域网 —— 家里 Wi-Fi、手机热点,任何能让两台设备直接互访的地方都行。(不能跨互联网迁移。迁移设计上就是"手对手"操作:两台手机你都得在场。)
  2. QR 握手。新手机显示一个 QR 码,里面是一次性的握手数据。老手机扫一下。两台设备用刚刚交换的内容,在它们之间临时建立一条封死的端到端加密通道 —— 这次迁移专用的密钥,跟你的账号密钥独立,用一次就丢
  3. 预检 (preflight check)。账号材料开始转移之前,两台客户端做一系列短的验证 —— 确认它们确实能看到对方、确认没有第三方插进来、确认新设备状态准备好接收。任何一步看起来不对,迁移在数据动之前就中止
  4. 封闭通道传输。你的身份密钥、当前和历史 prekey、你所在每一个群的群密钥、本地聊天历史,全部在这条点对点通道里从老手机流向新手机。用刚才交换的迁移密钥端到端加密。除了局域网这一段,所有东西都不上公网
  5. 校验+收尾。新手机校验"收到的"跟"应该收到的"一致,把自己标记为账号的当前活跃设备。老手机问你要不要清空自己(或者保留为副设备 —— 你定)。

整个流程几秒到几分钟,看你账号有多大(纯账号信息几秒,带几年消息历史和媒体附件可能一两分钟)。

我们的服务器在这个过程中看到什么

几乎什么都看不到

QR 码内容我们看不到(只在两台手机之间短暂存在)。两台设备之间的封闭通道我们看不到(是局域网 TCP 连接,根本没到我们这边)。传了什么我们看不到(全部走那条本地通道,不上我们这儿)。我们甚至看不到"有没有发生过迁移" —— 新设备的下一次连接看起来跟"老设备做了一次软件升级"完全一样,没法区分

跟"云备份"模式对照:WhatsApp 那边,即便开了端到端加密备份,Meta 的服务器还是持有你聊天历史的一个加密 blob。他们知道这个 blob 多大、什么时候上传、你有这么个东西。blob 是只能用你的密钥解的,但**"它的存在和它的 metadata"全暴露**。BlindPost 这边,这种 blob 在我们这边不存在。字节是在你掌控的两台设备之间直接走的。

代价

两个真实的限制:

我们听过这个请求 —— "你们能不能加一个可选的、opt-in 的加密云备份?" —— 我们持续婉拒可选功能往往会因为细小的 UX 引导慢慢变成默认且一旦"云备份"这个东西存在,服务器端就必须有支撑它的数据结构那一刻,整套"架构式隐私"的故事就塌成了"承诺式隐私"(见另一篇)。我们宁可让迁移变成一次手对手、你有意识地做一次、自己定时的操作。

你得到的

一次你亲眼能看到发生的迁移 —— 两台手机摆在你面前、两块屏幕都显示进度、它们在数据动之前先验证对方。没有第三方看到这场操作;任何入侵也恢复不出"那些从没经过的东西"

我们在别的文章讲过的整套隐私架构,如果背后挂着一个云备份,那些努力会被一个侧信道全部抵消"不经过服务器的迁移"是让整套架构保持诚实的那一块

立即体验 BlindPost