Skip to content

换设备后聊天历史可恢复性 / Chat History Recoverability After Device Change

最后更新 / Last updated: 2026-08-02 关联 / Related: gap-matrix.md B4、e2ee-key-rotation-policy.md

面向用户与支持人员的口径文档。换设备后「群聊历史回来了、单聊没回来」不是 bug, 是端到端加密的必然结果。 本文说明边界在哪、为什么、以及能做什么。


结论速查 / TL;DR

内容换设备后可恢复?前提
群聊历史(Megolm)✅ 可以旧设备做过备份,且记得备份密码
单聊历史(Olm 1:1)不可以无论是否备份
身份密钥(RSA 私钥)✅ 可以同上
换设备后的消息✅ 正常收发无需备份,登录即可

为什么单聊历史不能恢复

单聊走 Olm 双棘轮(Double Ratchet)。它的 session 状态不只是一把密钥,还包含 发送侧棘轮的当前位置。如果把这个状态复制到第二台设备上还原:

  • 两台设备会从同一个棘轮位置继续发送 → 密钥重用(key reuse)
  • 棘轮分叉(ratchet fork),前向保密(forward secrecy)与 后泄露安全(post-compromise security)双双失效。

也就是说,「能跨设备还原单聊 session」与「双棘轮的安全保证」不可兼得。 这不是 IMBoy 的实现取舍,是协议本身的性质 —— Signal 与 Matrix 同样不备份 1:1 session,换设备后同样看不到旧的单聊记录。

技术边界固化在代码里:imboyapp/lib/service/e2ee/megolm_backup_section.dart 的收集器只认 megolm_inbound_ 前缀olm_* 一律不进备份载荷; test/service/e2ee/megolm_backup_section_test.dart 用反向断言守着这条线 (Olm pickle 的值不得出现在备份包的任何位置)。

为什么群聊历史可以恢复

群聊走 Megolm,收包用的是 inbound session —— 天然只读,不含发送侧棘轮态。 把它跨设备还原不会造成密钥重用,因此可以安全地纳入备份。

这是 2026-08-02(P3-1)补上的能力。在此之前群聊历史同样全灭,是当时用户可 感知的最大缺口。


操作指引 / How To

换设备前(必做)

  1. 旧设备:设置 → E2EE 密钥备份 → 创建备份
  2. 牢记备份密码。密码不上传、服务端不掌握,丢失即不可恢复 —— 服务端只盲存密文,没有任何后门可以帮你解开。
  3. 备份文件妥善保存(或使用云备份)

换设备后

  1. 新设备登录 → 设置 → 导入 E2EE 备份 → 选择备份文件 → 输入备份密码
  2. 导入成功后:群聊历史逐步可见;单聊历史保持不可读(密文仍在,但没有也不会 有能解开它的密钥)
  3. 新消息不受影响,正常收发

没有备份怎么办

群聊与单聊历史都无法恢复。可做的只有:

  • 让群成员在群里重新分享关键信息
  • 新消息不受影响

常见误解 / FAQ

Q:服务器上有我的消息,为什么不能给我? 服务器存的是密文,且从不接触明文私钥。没有你设备上的密钥,那些字节对服务器 和对攻击者一样无意义。这正是端到端加密的目的。

Q:那能不能把单聊也做成可恢复? 能,但代价是放弃双棘轮的前向保密与后泄露安全 —— 等于把 E2EE 降级成「服务端不看, 但一旦密钥泄露历史全泄」。IMBoy 明确不做这个取舍。

Q:备份密码忘了,能重置吗? 不能。密码是备份的唯一解密材料,服务端从未持有。这是设计,不是缺陷。

Q:为什么导入成功了,单聊还是显示不出来? 预期行为。导入成功对话框会明示:「群聊历史已随备份恢复;单聊历史无法恢复」。


残留与路线 / Residual

  • 当前 UI 明示落在导入成功对话框e2ee_backup_import_pagee2eeBackupImportSuccessNote,10 语言已对齐)。换设备前的提示尚未加, 用户可能在没做备份的情况下换机 —— 属后续项。
  • 单聊历史的可恢复性不在路线图上,理由见上方 FAQ。

IMBoy — 企业私有化即时通讯平台