diff --git a/README.md b/README.md index ec7bd77..f8e2b66 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,26 @@ curl -fsSL https://raw.githubusercontent.com/Freecode100Year/htmlroom/main/scrip 这些数字只针对口令这把「外层锁」。聊天内容本身由每对成员的 ECDH + ML-KEM-768 会话密钥保护,和口令是两回事。表格里的估算脚本和 PBKDF2 参数可在[安全模型](docs/html-room/security-model.md#口令抗暴力破解)查到。 +### 实测报告:能从房间文件里拿到口令吗? + +**日期**:2026-10-29 **执行模型**:Claude Opus 4.8(`claude-opus-4-8`) + +拿一个真实的加密房间文件(`encrypted: true`,默认中继 `wss://chat.nya.je`)做了两项测试。 + +**1. 文件是否泄露口令 —— 没有。** 文件里只有口令包装后的密文(`salt` 16 字节、`iv` 12 字节、`ciphertext` 48 字节)和 KDF 参数(PBKDF2-SHA-256,310000 轮),**没有主密钥、也没有明文口令**。想拿到口令,只能离线逐个猜。 + +**2. 离线猜测有多快 —— 弱口令很快,生成口令不可行。** 用项目自己的 `unlock()`,对一个临时创建、口令是随机 4 位 PIN 的房间做了完整爆破:第 483 次命中,单核约 **20 次 / 秒**(含 PBKDF2 310000 轮 + AES-GCM 解包)。按这个实测速度推算(与上表一致): + +| 口令 | 本机单核实测速度下 | +| --- | --- | +| 4 位数字 PIN | 约 4 分钟(高端 GPU 上瞬间) | +| 常见词 / 泄露库里的口令 | 约 4 天(高端 GPU 上几十秒) | +| 「随机生成口令」(约 99 位熵) | 约 5×10²⁰ 年 | + +**结论:** 房间文件本身守得住——它不交出口令。能不能被破,完全取决于口令强度:弱口令(PIN、常见词)在普通硬件上很快就试到,而页面「随机生成口令」给出的 20 位口令实际上破不开。**请用「随机生成口令」,并通过独立渠道把口令告诉对方。** + +> 测试只针对口令这把外层锁,没有尝试破解任何真实房间,也没有在仓库里留下破解工具。方法:检查文件是否含明文密钥或主密钥,再用项目自带的 `unlock()` 对一个自建的弱口令房间计时。 + ## 常见问题 **微信 / QQ / iPhone 里点开文件没反应?**