Skip to content

fix: 离线解密恢复 WAL 并区分密钥认证与索引损坏 - #168

Merged
2977094657 merged 7 commits into
LifeArchiveProject:mainfrom
xiaoshengbao:codex/fix-issue-166-offline-decryption
Sep 28, 2026
Merged

2977094657 merged 7 commits into
LifeArchiveProject:mainfrom
xiaoshengbao:codex/fix-issue-166-offline-decryption

Conversation

@xiaoshengbao

@xiaoshengbao xiaoshengbao commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #166

离线解密此前忽略未 checkpoint 的 WAL,同时把输出完整性失败当作密钥认证失败。本次恢复经校验的已提交 WAL 页面;如果所有页面认证通过,而输出仅有已识别的索引条目异常,则在临时副本上重建对应索引,完整性检查通过后才原子发布。失败时保留已有输出,原始微信文件不修改。

保留 session + message 跨库密钥认证,将密钥正确性与输出结构完整性分开。界面显示部分成功、失败文件、密钥认证状态及索引恢复提示。损坏 WAL、页面 HMAC 错误、源文件变化和表页损坏仍明确报错。

针对 Issue #166 的验证

已合并上游 1b516cf 的新 macOS source-public 运行时。用户完成系统钥匙串授权后,标准 npm run dev 启动了 Nuxt、Electron 和完整后端,健康检查通过。没有绕过过期、签名或授权检查。

  • 同一加密复现样本:修复前 3/3 页 HMAC 通过,出现 Issue 同名索引条目数错误,session 失败并拒绝保存密钥;修复后的桌面后端成功处理并保存密钥。
  • 有 WAL:恢复 1 个已提交帧,完整性检查通过,无需重建索引。无可用 WAL:只重建损坏索引,完整性检查通过,两条预期记录均保留。
  • 两个样本通过桌面后端 POST;WAL 样本还通过桌面页面使用的 SSE 接口,均为 2/2 数据库成功、0 失败、密钥保存成功。
  • 复用现有真实账号稳定副本,约 1.24 GiB:桌面后端 20/20 数据库成功,独立完整性检查 20/20 通过,密钥保存成功,输入 SHA-256 不变。
  • 指定 source=decrypted,会话和消息接口分别返回 5 个会话、5 条消息;实际 Electron 聊天窗口能够显示已有数据。
  • 76 项相关 Python 测试、3 项前端反馈测试通过;生产前端构建成功生成 34 个路由;git diff --check 通过。

验证范围

真实账号没有原生索引损坏;报告者仅提供日志,没有提供其 734 页原始数据库。同名索引损坏由真实 SQLite 页构造的加密样本复现,不能声称已经验证过报告者原库。

桌面验证覆盖真实应用启动、完整后端的针对性回归和可见聊天页面;不宣称自动点击完成整个首次使用/密钥捕获向导。此前最小 FastAPI 路由容器的测试只作为补充证据。

详细记录见 docs/issue-166-validation.md。PR 不包含真实账号标识、密钥、聊天内容、数据库或原始日志。

@xiaoshengbao
xiaoshengbao marked this pull request as draft September 28, 2026 10:22
@xiaoshengbao
xiaoshengbao marked this pull request as ready for review September 28, 2026 13:13
@2977094657
2977094657 merged commit 6230a3f into LifeArchiveProject:main Sep 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] 离线批量解密:session.db 逐页 HMAC 全部通过,但 quick_check 报索引损坏;微信完全退出、密钥确认无误仍复现

2 participants