你买了一台新手机。你想把 messaging app 搬过去,带上聊天记录、联系人、群聊,所有东西。
如果你用 WhatsApp:在新手机上装好 → 输手机号 → 收短信 → app 从 Meta 的服务器把你的账号历史(以及越来越多的端到端加密消息)拉下来。你的数据在迁移过程中绕了一遍第三方 —— 传输是加密的,但 metadata(什么时候上传、多大、是哪个账号)暴露,而那个加密 blob 在他们的云上停留你完成设置所需要的整段时间。
如果你用 Signal:体验更友好一些 —— 扫 QR 码绑定新手机,新设备通过 Signal 的中继跟老设备认证。老消息默认不迁移;想要的话走另一个独立的备份-恢复流程,用一组单独生成的口令。
BlindPost 跟两者都不一样。你的新手机和老手机直接通过本地 Wi-Fi 连接,建立一条封死的端到端加密通道,它们之间互传你的账号材料。我们的服务器全程看不到迁移这件事发生。你的身份、密钥、聊天历史,没有任何一字节经过我们的基础设施。
下面讲讲这是怎么做到的。
数据走的那条路
- 同一个网络。两台手机要在同一局域网 —— 家里 Wi-Fi、手机热点,任何能让两台设备直接互访的地方都行。(不能跨互联网迁移。迁移设计上就是"手对手"操作:两台手机你都得在场。)
- QR 握手。新手机显示一个 QR 码,里面是一次性的握手数据。老手机扫一下。两台设备用刚刚交换的内容,在它们之间临时建立一条封死的端到端加密通道 —— 这次迁移专用的密钥,跟你的账号密钥独立,用一次就丢。
- 预检 (preflight check)。账号材料开始转移之前,两台客户端做一系列短的验证 —— 确认它们确实能看到对方、确认没有第三方插进来、确认新设备状态准备好接收。任何一步看起来不对,迁移在数据动之前就中止。
- 封闭通道传输。你的身份密钥、当前和历史 prekey、你所在每一个群的群密钥、本地聊天历史,全部在这条点对点通道里从老手机流向新手机。用刚才交换的迁移密钥端到端加密。除了局域网这一段,所有东西都不上公网。
- 校验+收尾。新手机校验"收到的"跟"应该收到的"一致,把自己标记为账号的当前活跃设备。老手机问你要不要清空自己(或者保留为副设备 —— 你定)。
整个流程几秒到几分钟,看你账号有多大(纯账号信息几秒,带几年消息历史和媒体附件可能一两分钟)。
我们的服务器在这个过程中看到什么
几乎什么都看不到。
QR 码内容我们看不到(只在两台手机之间短暂存在)。两台设备之间的封闭通道我们看不到(是局域网 TCP 连接,根本没到我们这边)。传了什么我们看不到(全部走那条本地通道,不上我们这儿)。我们甚至看不到"有没有发生过迁移" —— 新设备的下一次连接看起来跟"老设备做了一次软件升级"完全一样,没法区分。
跟"云备份"模式对照:WhatsApp 那边,即便开了端到端加密备份,Meta 的服务器还是持有你聊天历史的一个加密 blob。他们知道这个 blob 多大、什么时候上传、你有这么个东西。blob 是只能用你的密钥解的,但**"它的存在和它的 metadata"全暴露**。BlindPost 这边,这种 blob 在我们这边不存在。字节是在你掌控的两台设备之间直接走的。
代价
两个真实的限制:
- 必须两台手机都在场。"老手机丢了,想在新手机上恢复历史" —— 我们这边没办法。迁移通道是两台设备之间的,两台都得在线、能互通。如果老手机坏了 / 丢了 / 被偷了,你唯一的恢复手段是那 12 个词的助记词(前一篇文章讲过),它能恢复你的身份,但恢复不了历史消息 —— 因为那些消息只在老手机上存在过,从没在我们服务器上。
- 得在退役老手机之前做这件事。这是"没有云备份"带来的一个小但真实的摩擦。我们没有(架构上也不能)从一个我们从未做过的备份里恢复你的消息。同一个属性给你换来了"你对我们的隐私",同时也意味着你没法"懒迁移"。
我们听过这个请求 —— "你们能不能加一个可选的、opt-in 的加密云备份?" —— 我们持续婉拒。可选功能往往会因为细小的 UX 引导慢慢变成默认。且一旦"云备份"这个东西存在,服务器端就必须有支撑它的数据结构。那一刻,整套"架构式隐私"的故事就塌成了"承诺式隐私"(见另一篇)。我们宁可让迁移变成一次手对手、你有意识地做一次、自己定时的操作。
你得到的
一次你亲眼能看到发生的迁移 —— 两台手机摆在你面前、两块屏幕都显示进度、它们在数据动之前先验证对方。没有第三方看到这场操作;任何入侵也恢复不出"那些从没经过的东西"。
我们在别的文章里讲过的整套隐私架构,如果背后挂着一个云备份,那些努力会被一个侧信道全部抵消。"不经过服务器的迁移"是让整套架构保持诚实的那一块。
BlindPost