Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 里点开文件没反应?**
Expand Down
Loading