关于 Argon2id 算法
加密笔记用它把口令变成 256 位密钥;本文说明为什么暴力破解不可行。
要点
- 内存硬:每次尝试都要占用
m=256 MiB, t=4, p=1,一次猜测就吃掉 256 MiB。 - 并行受内存限制:同时猜 N 个口令就要 N×256 MiB;一张 80 GB 的 H100 最多约 300 路,不是无限。
- 空间指数增长:随机密码每多一位,搜索空间 ×62。
- 只保护强密码:Argon2 抬高每次尝试的成本,但救不了字典词与短数字。
破解时间估算
随机密码,字符集 62(A–Z a–z 0–9);平均时间 = 搜索空间 ÷ (2 × 速率)。数量级估算,非精确基准。
| 密码长度 | 单核 CPU | 9950X 16 核 | 1× H100 | 1000× H100 |
|---|---|---|---|---|
| 8 位 | 173.0 万年 | 10.8 万年 | 1.2 万年 | 12 年 |
| 10 位 | 66.5 亿年 | 4.2 亿年 | 4,432.6 万年 | 4.4 万年 |
| 12 位 | 2.56×1013 年 | 1.60×1012 年 | 1,703.9 亿年 | 1.7 亿年 |
| 16 位 | 3.78×1020 年 | 2.36×1019 年 | 2.52×1018 年 | 2.52×1015 年 |
AES-256-CTR 与密钥校验
正文与目录先拼成一段明文 NOTESv1{...},再用 Argon2id 派生的 256 位密钥以 AES-256-CTR 加密(随机 IV,与密文一起公开存储)。
- 错误密钥也能"解密成功":CTR 是流密码,任意 256 位密钥都能把密文解成等长字节流,不会报错——只是结果是随机乱码。
- 如何判断密钥对错:明文开头有预定义的前 7 个字符
NOTESv1(magic)。解密后若前 7 字节与之完全一致,才认为密钥正确并继续解析后面的 JSON;否则判定为错误密钥,页面只显示乱码。 - 不泄露口令:magic 是公开常量,校验只是自证,不暴露任何密钥信息;错误密钥恰好猜中 magic 的概率约 2-56,可忽略。
结论
10 位以上的随机密码,即便 1000 张 H100 也要数万年;12 位以上基本不可行。与其堆机器,不如换更长的随机密码。