Skip to content

v2.4.0 前向保密,网页可核验

Choose a tag to compare

@github-actions github-actions released this 16 Oct 09:45
· 47 commits to main since this release

隐匿对话 v2.4.0:前向保密,网页可核验

与 2.x 兼容:暗号、房间地址都不变,新旧版本可以在同一个房间里。

前向保密(协议 v3)

  • 每人进房时在浏览器里生成临时密钥(ECDH P-256),公钥用暗号密钥封好后再发出,服务器看不懂也伪造不了。
  • 每条消息用一次性钥匙加密(HMAC 链,用过即丢);有人离开、掉线或被移出,留下的人全部换钥匙。
  • 临时密钥只在网页内存里:事后拿到暗号,也解不开当时录下的密文。
  • 安全码:侧栏显示 6 位数字,由每个人的临时公钥算出;大家核对一致,就说明中间没有人被调包。
  • 丢消息提示:中间有消息没送到(断网或被服务器丢弃),会提示少了几条。
  • 新旧共存:房间里有旧版本的成员,或服务器是旧版本时,全员自动退回旧方式,侧栏和对话里明确提示「暂未启用前向保密」;旧版本的人离开后自动恢复。服务器故意丢掉密钥消息,也只能造成这种看得见的退回。
  • 服务器只多转发两样看不懂的东西:密钥帧(单独限额,不受 6 秒间隔限制)和消息序号。

网页可核验

  • 部署和构建时生成 /integrity.json:网页每个文件的 SHA-256,用发布密钥(server/release-key.pem)签名。
  • node scripts/verify-site.mjs <网址> [--min-version 2.4.0] 从外部核对一个正在运行的网站:清单签名、每个文件的哈希、页面引用的脚本有没有清单以外的。
  • GitHub 上的 site-watch 每 6 小时替 chat.freedom8964.com 核对一次。
  • 外部核对看不到「只对某个人下发改过的代码」;担心这一点请用安卓 App 或离线包(网页随安装包签名发布)。

安卓

测试

单元测试 57 项(三系统);浏览器端到端测试 101 项,加上 v3 专项测试(三人房间、离开换钥、模拟旧版客户端加入和离开),在本地、Cloudflare 运行时和线上都已通过;安卓 WebView 83 实测通过。

⚠ 自己部署的 Docker / 离线包升级后,旧版网页的标签页需要刷新才会用上 v3。升级会断开当时的聊天。

🤖 Generated with Claude Code