回收 411 MB(470 M → 58.8 M),全部经回收站,可恢复: - 待清理/(146.2 M,含 relay 分片 128 M 与 42 项过程目录) - tmp/(32.4 M,按接续棒命名的过程临时区) - .workbuddy/tmp/(39.5 M) - 4 份 workbuddy.db 冗余副本(101 M,09-23 事故的坏副本 / 抢救产物) - tmp/im16/gw/centrifugo 二进制(63.9 M,可重下)+ 缓存残留 入库范围:常驻规则(CODEBUDDY.md / README.md / state.py)、在途接续入口与 接续包、docs/、交付物/、交接单/、归档/、scripts/、.codebuddy/、 .workbuddy/memory/;共 398 件,其中 >60 KB 的 26 件全为文档。 排除(.gitignore):tmp/、待清理/、运行态日志与缓存、*.db 与 DB 备份整目录、 打包二进制(*.tar.gz / *.tgz)、记忆修复前备份。
15 KiB
MLE / 加密去重「最优解」调研报告
调研对象:覆盖网络线 · 组密钥加密单 §10-3 定稿口径所衍生的安全性风险(相等性泄露 / 持钥者离线枚举) 调研日期:2026-09-18 | 方法:学术文献 5 篇主线 + 工程实现(RFC 9497 三个实现 + DupLESS 官方代码) 一句话结论:🔴 "绝对安全 / 性能不受影响 / 保持跨节点共享去重"三者兼得的方案不存在(定理级,非实现缺陷);可争取的最优 = 把离线枚举抬成在线限速查询。 ⛔ 本报告零代码改动、零服务器改动;所有候选均未立项。
§1 问题定义
既有定稿口径(组密钥加密单 §10-3):
「中继看不到明文」成立,但「内容不可推断」不成立。
暴露面拆成三条(均已实测,非推断):
| # | 暴露 | 谁能看到 | 实测读数 |
|---|---|---|---|
| ① | 相等性 / 重复率可观测 | 🔴 中继(无密钥) | 10,000 块 / 100 值域 ⇒ 仅 100 种密文(相等性直接可见) |
| ② | 低熵内容可枚举 | 持组密钥者(含被攻破节点) | 85,878 条/秒;域 2³² ⇒ 全量 14.7 h |
| ③ | 读取明文 | —— | 底线守住:中继自造字典命中 0/1000;持 1 对明文-密文也预测不出别的(0/999) |
⇒ 定性 = 元数据 / 相等性泄露级,⛔ 不是"数据泄露级"。
根因:当前 1.0× 回源(而非 N×)完全来自「相同明文 ⇒ 相同密文 ⇒ 相同块 id」这一可判定性,而这个可判定性就是相等性泄露的来源。
⇒ 去掉泄露必然去掉可判定性 ⇒ 必然失去跨节点共享 ⇒ 性能退化到 N×(或存储 ×N)。
§2 文献结论(三条硬结论 · 全部为印证,⛔ 非推翻)
2.1 收敛加密对可预测内容必被暴力攻破
- Bellare, Keelveedhi, Ristenpart — Eurocrypt 2013(MLE 原论文):
brute-force attacks exist for all message-locked encryption schemes. MLE 仅对 unpredictable messages 提供机密性(消息空间无法被穷尽)。
- 暴力速度量级(DupLESS 官方页):up to 12,000 attempts/sec(单核、短文件),且完全可并行。
⇒ 与本项目实测
85,878 条/秒同量级(我们更快 = 实现更粗 / 值域更小 / 硬件更新)。
2.2 🔴 相等性泄露是「必要代价」、不可消除
DupLESS 官方页原文(这是文献对 §10-3 最直接的确认):
If the attacker cannot authenticate herself to the KS, we ensure high security. (Effectively, semantic security, except that ciphertexts leak equality of the underlying plaintexts. The latter is necessary for deduplication.)
⇒ SA-MLE / DupLESS 抗的是「离线暴力恢复明文」,⛔ 不消除相等性泄露 —— 因为去重本身就必须保留相等性。
⇒ 「KS 被攻破 ⇒ 回落收敛加密级」是 compromise resilience,含义是"不更差",⛔ 不是"更强"。
2.3 我们尚未覆盖的一类攻击 + 其解法的代价
- Hack Tahoe-LAFS!(Drew Perttula & Brian Warner, 2008):除经典的 confirmation-of-a-file 外,另有 learn-the-remaining-information(LRI) 攻击。
其解法 = 引入共享秘密
K = H(S ‖ M)⇒ 🔴 代价:去重仅限共享该秘密的用户,且秘密泄露即全崩。 - domain separation(xn--2-umb.com「Convergent Encryption」):把收敛哈希
HA改为带密钥的 keyed hash ⇒ 可抗上述攻击,但去重域随之收窄到同KA域内。
2.4 补充:备份工具(Restic / Borg)走的是第三条路
- 两者均 = 加密前分块 + 明文哈希索引 + 随机 nonce / 各自密钥加密。
- 原文一句:client-side deduplication and strong encryption are mathematically incompatible unless you separate the two。
- ⇒ 它们明确放弃"相同明文 ⇒ 相同密文",换取不泄露相等性;代价 = 跨机器 / 跨用户去重失效。
§3 方案族全景(六类 · 一表定取舍)
| 方案族 | 代表 | 抗离线暴力 | 抗相等性泄露 | 去重域 | 性能 / 存储代价 |
|---|---|---|---|---|---|
| ① 收敛加密 / MLE | Tahoe-LAFS、HA=H(M) |
❌ 不抗 | ❌ 不抗 | 全局 | 最优(本项目现状) |
| ② 加盐 / per-file 随机 | 常规加密 | ✅ | ✅ | ❌ 归零 | 存储 ×N、无回源 |
| ③ 域分离 keyed hash | xn--2-umb 建议 | ✅(跨域) | ✅(跨域) | 同域内 | ≈ 0(⭐代价最低) |
| ④ SA-MLE / OPRF 密钥服务 | DupLESS、ClouDedup | ✅(限速后) | ❌ 仍泄露 | 全局(可限域) | put +17%、带宽 <1%、存储 3L+120 B |
| ⑤ 分布式 / 阈值 OPRF | eprint 2013/807、TOPRF | ✅ | ❌ 仍泄露 | 全局(可限域) | 同 ④ + DKG 开销;消除 KS 单点 |
| ⑥ 走 Restic/Borg 路线 | restic、borg | ✅ | ✅ | ❌ 归零 | 即 ②(换工程成熟度) |
🔴 读法:没有任何一列能同时在三处打 ✅。这正是"三者互斥"的可视化形式。
后续研究线(可选读,⛔ 本轮未展开):BL-MLE(块级双重加密)|UMLE(块二叉树,更新 O(logM))|FuzzyMLE(相似性哈希 ⇒ 相似但不相同也能重删)|RekeyDedup(MLE 密钥不可撤销 ⇒ 引入 rekeying,正对应本项目"块 id 须换口径")|MetaDedup(CUHK ADSLab,降元数据开销)。
§4 工程实现(🔑 可直接用 · ⛔ 无需自研密码学)
关键进展:RFC 9497(2023)已把 OPRF / VOPRF / POPRF 标准化 ⇒ DupLESS 用的 OPRF 不再是"论文原语",而是正式标准。
| 实现 | 语言 | 许可 | 状态 | 备注 |
|---|---|---|---|---|
facebook/voprf |
Rust | MIT / Apache-2.0 双许可 | v0.6.0-pre.0,MSRV 1.83,2025-11 仍在更新,76★ |
生产级 · 首选 |
bytemare/voprf |
Go | MIT | 136 commits,含 TOPRF + DKG | ⭐ 含阈值 OPRF,对应"去单点" |
oprf |
Python | —— | pip install oprf(Ristretto255) |
⭐ 可纯 Python 跑 ⇒ 适合本机原型验证 |
| DupLESS 官方代码 | —— | —— | UCSD 页 → Download Code | 原型 KS 官称"20 行 Python + Apache on EC2" |
性能对照(DupLESS 实测 · 1 MB put 到 Dropbox):
| 项 | 读数 |
|---|---|
| 总时间开销 | ≈ 17% |
| 带宽开销 | < 1% |
| 分解 | KS 交互 371 ms (9.1%)/TLS 243 ms (5.9%)/加密 49 ms (1.2%)/哈希 22 ms/客户端 RSA 6 ms/上传 3676 ms (89.7%) ⇒ 合计 4099 ms |
| 存储开销 | 3L + 120 bytes |
| 🔑 结构要点 | 仅 store 需 KS 交互(读路径不涉及);KS 不可用 ⇒ fail-safe 回落常规加密 |
⚠️ 口径界:2013 年 Dropbox / EC2 单机实验,⛔ 不可直接外推到本平台。
✅ 但「加密 / KS 开销占比远小于 I/O」这一结构,与本项目实测(加密全链 1.890×、但绝对值仅 ~20 ms)方向一致。
§5 对本项目的适配(三条结构性发现 · 本轮新增)
5.1 🔑 DupLESS 的 KS 可以直接落成我们的 Manager(47)
本项目已有既有判据:「权威状态单点 Manager」「归属 / 租约只有 Manager 能写」。 ⇒ 架构天然吻合,不需要新增组件。 ⚠️ 但须先定 KS 的域边界:全局一个 / 每 network 一个 —— 它直接决定去重域(见 §3 ④ 的"可限域")。
5.2 🔑 文献已给出 DupLESS「KS 单点故障 / 效率瓶颈」的解法
eprint 2013/807 — Distributed Key Generation for Secure Encrypted Deduplication:
- 给出 DupLESS 在随机预言机模型下的严格安全证明(原论文所缺);
- 用分布式密钥生成消除 KS 单点,使 P2P 系统同样可达该安全级。
⇒ ⚠️ 与本项目 P2P / 覆盖网络形态高度契合 ⇒ 若走 ④ 路线,应直接上阈值 / 分布式 OPRF(TOPRF),⛔ 不做单点 KS(bytemare/voprf 已含 TOPRF + DKG)。
5.3 ✅ 一个"代价 ≈ 0"的真发现:域分离
把块 id 的 HA 从裸哈希改成带每个-network 密钥的 keyed hash(域分离):
- ✅ 可抗 COF / LRI / 跨域离线枚举;
- ✅ 而跨 network 本来就不该去重(不同租户 / 不同覆盖网络)⇒ 对本项目代价 ≈ 0;
- 🔴 但只切断跨域攻击 —— 同一 network 内部持钥者枚举(
85,878 条/秒)依然存在。
⇒ 定位:低成本加分项,⛔ 不是 §10-3 的解。
5.4 三选项与倾向(沿用既有结论,本文补文献背书)
- A 保持现状 + 明确披露 —— 性能最优、零改动;相等性泄露永久存在(文献确认不可消除)。
- B 按熵分层 —— 低熵块加随机盐(真正破坏相等性);高熵块保持确定性共享;⚠️ 低熵块彻底失去共享 ⇒ 该部分
1×→N×;块 id 须换口径 ⇒ 触 §9-5。 ⭐ 工程上 B 的"标准形态"就是 ④ SA-MLE / OPRF(RFC 9497 实现现成)。 - C per-node 子密钥 —— 唯一"连相等性都不泄露";代价 = 回源与存储
×N、中继节省93.75% → 0⇒ 等于放弃序 ㉔ / ㉜ / ㉝ 的全部成果(即 §3 的方案 ②/⑥)。
倾向 = A + B 组合(按内容分级);⚠️ 但 B 的成本须**先量「低熵块在首屏包里占多少字节」**才能定边界。
§5.5 B 方案的改造复杂度与收益量化
既有实现底座(已取证):chunker.ts#blockIdOf = sha256(字节) 前 32 hex(只由字节决定)|content/crypto.ts = 组密钥实现|package.json 依赖极简(fastify / better-sqlite3 / pg)⇒ 零第三方密码学库;但 @fastify/rate-limit 已在依赖中 ⇒ KS 限速中间件现成。
改造清单(6 项 · 唯一真难点 = OPRF 原语)
| # | 改动 | 量级 | 说明 |
|---|---|---|---|
| 1 | Manager 侧新增 KS 端点 | 小 | 复用 fastify + 现成限速中间件 |
| 2 | 客户端密钥派生改造 | 中 | k = HMAC(key,…) ⇒ mleKey = OPRF_KS(H(明文)) |
| 3 | 🔴 OPRF 原语 | 难(唯一) | 引 @noble/curves 须走 dsh 依赖披露;或降级为非盲化 HMAC 派生(零依赖,但 Manager 会知道块指纹) |
| 4 | fail-safe 降级 | 小 | KS 不可达 ⇒ 回落常规收敛加密 |
| 5 | E1 判据扩展 |
小 | 加 KS 交互 / 降级项 |
| 6 | ✅ 块 id / 存储 / 去重率 | 零 | 🔑 确定性保持 ⇒ blockIdOf 不用改、storeBytes 不翻倍 |
⇒ 结论:B 比"按熵分层加盐"更简单 —— 加盐方案必须动块 id 与去重率,B 两样都不动。
收益量化(本项目实测 85,878 条/秒 vs DupLESS 限速 ≈3.3 条/秒)
| 攻击者 | 现状 | B 后 | 提升 |
|---|---|---|---|
| 中继(无密钥) | 可判相等性(10,000 块/100 值域 ⇒ 100 种密文) |
完全一样 | 1×(零改善) |
| 外部攻击者(无 KS 认证) | 离线 ⇒ 域 2³² 13.9 h |
无法离线派生 + 查不了 KS | 不可行 |
| 组内持钥者(可认证) | 13.9 h | 41.3 年 | ≈ 26,000× |
| 组内持钥者 · 极低熵(域 100) | 1.16 ms |
30.3 s |
两边都是"秒破" |
| Manager 被攻破 | —— | 回落收敛加密 | 不更差 |
🔴 判定:B 只对「高熵且可枚举」有效(ID / 口令类);对低熵块与中继侧相等性泄露近乎无用 ⇒ ⛔ 不是 §10-3 的完整解。
§6 阻碍(6 条)
- 理论层 —— MLE 对低熵「可去重且不泄露相等性」不可能(§2.1/2.2);OPRF 只是把"判定相同"的能力从中继收窄到 OPRF 服务端,相等性本身仍可见 ⇒ 收窄 ≠ 消除。
- 块 id 口径必须换 ——
β′(密文哈希)正是共享的前提;换口径 ⇒ 全部既有块 id 失效。 - 超出在册文件集 ⇒ 直接触发组密钥单 §9-5 回头条件。
- 判据体系要重写 ——
E1须重做 + 需新建「低熵块识别」判据;而「什么算低熵」本身无可靠判据(开放问题:做错 ⇒ 要么无效、要么白付代价)。 - 存储已在告急 —— 轮换实测已让
storeBytes翻倍(5,255,393 → 10,510,786)⇒ 再叠×N容量账要重算。 - 🆕 KS 域边界未定 —— 决定去重域,且是"跨租户去重是否允许"的合规/产品级问题(⛔ 按 §二 铁律,合规不进技术方案,但域边界的技术选择必须先定)。
§7 若立项的前置动作(⛔ 本轮未做)
- 先量 「低熵块在首屏包里占多少字节」(决定 B 的收益 / 代价比)。
- 定 KS 域边界(全局 vs 每 network)。
- 复核
E1判据体系重写范围。 - 复核 存储容量账(
storeBytes翻倍 + 可能×N)。 - 立项形态 = 方案类文档 ⇒ 须落
04-调整方案/<NN>+ 交接单;⚠️ 抢全局执行锁后再动。
§8 参考文献
学术
- Bellare, Keelveedhi, Ristenpart. Message-Locked Encryption and Secure Deduplication. Eurocrypt 2013.
- Bellare, Keelveedhi, Ristenpart. DupLESS: Server-Aided Encryption for Deduplicated Storage. USENIX Security 2013. — https://cseweb.ucsd.edu/~skeelvee/dupless/
- Perttula, Warner. Hack Tahoe-LAFS! 2008.(COF + LRI 攻击)
- Distributed Key Generation for Secure Encrypted Deduplication. eprint 2013/807. — https://eprint.iacr.org/2013/807
- The Design and Implementation of a Rekeying-Aware Encrypted Deduplication Storage System.(RekeyDedup,ACM TOS)
- MetaDedup(CUHK ADSLab)| BL-MLE | UMLE | FuzzyMLE(后续改进线)
- smarx.com. Convergent Encryption and Why No One Uses It. 2020.
- xn--2-umb.com. Convergent Encryption.(domain separation 建议)
工程
9. RFC 9497 — Oblivious Pseudorandom Functions (OPRFs) Using Prime-Order Groups. 2023.
10. facebook/voprf(Rust,MIT/Apache-2.0)| bytemare/voprf(Go,MIT,含 TOPRF + DKG)| oprf(Python,PyPI)
11. restic / BorgBackup 官方文档与设计说明("第三条路"对照)
12. ClouDedup(Eurecom)—— 块级、不依赖单一组件安全,抗侧信道 / 访问模式攻击
§9 边界声明
- ⛔ 本轮零代码 / 零服务器改动;⛔ 未动任何受锁保护文件(全局执行锁仍被「日志可观测面-实现-20260918」占用)。
- 本报告为研究工作底稿,位置在工作区根;⛔ 尚未并入文档库
04-调整方案/(待锁释放后按占号规则决定)。 - 本报告不构成立项;§5.4 的 A/B/C 与 §5.3 的域分离均为候选。