Files
dsh_ai1net_server/docs/调研与审计/调研_MLE加密去重最优方案_20260918.md
admin ce8e6ceed9 chore(工作区): 纳入版本控制基线(回收 411 MB 过程产物)
回收 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)、记忆修复前备份。
2026-09-24 07:51:03 +08:00

15 KiB
Raw Permalink Blame History

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 条)

  1. 理论层 —— MLE 对低熵「可去重且不泄露相等性」不可能(§2.1/2.2);OPRF 只是把"判定相同"的能力从中继收窄到 OPRF 服务端,相等性本身仍可见 ⇒ 收窄 ≠ 消除。
  2. 块 id 口径必须换 —— β′(密文哈希)正是共享的前提;换口径 ⇒ 全部既有块 id 失效。
  3. 超出在册文件集 ⇒ 直接触发组密钥单 §9-5 回头条件。
  4. 判据体系要重写 —— E1 须重做 + 需新建「低熵块识别」判据;而「什么算低熵」本身无可靠判据(开放问题:做错 ⇒ 要么无效、要么白付代价)。
  5. 存储已在告急 —— 轮换实测已让 storeBytes 翻倍(5,255,393 → 10,510,786)⇒ 再叠 ×N 容量账要重算。
  6. 🆕 KS 域边界未定 —— 决定去重域,且是"跨租户去重是否允许"的合规/产品级问题(⛔ 按 §二 铁律,合规不进技术方案,但域边界的技术选择必须先定)。

§7 若立项的前置动作(⛔ 本轮未做)

  1. 先量 「低熵块在首屏包里占多少字节」(决定 B 的收益 / 代价比)。
  2. 定 KS 域边界(全局 vs 每 network)。
  3. 复核 E1 判据体系重写范围。
  4. 复核 存储容量账(storeBytes 翻倍 + 可能 ×N)。
  5. 立项形态 = 方案类文档 ⇒ 须落 04-调整方案/<NN> + 交接单;⚠️ 抢全局执行锁后再动。

§8 参考文献

学术

  1. Bellare, Keelveedhi, Ristenpart. Message-Locked Encryption and Secure Deduplication. Eurocrypt 2013.
  2. Bellare, Keelveedhi, Ristenpart. DupLESS: Server-Aided Encryption for Deduplicated Storage. USENIX Security 2013. — https://cseweb.ucsd.edu/~skeelvee/dupless/
  3. Perttula, Warner. Hack Tahoe-LAFS! 2008.(COF + LRI 攻击)
  4. Distributed Key Generation for Secure Encrypted Deduplication. eprint 2013/807. — https://eprint.iacr.org/2013/807
  5. The Design and Implementation of a Rekeying-Aware Encrypted Deduplication Storage System.(RekeyDedup,ACM TOS)
  6. MetaDedup(CUHK ADSLab)| BL-MLE | UMLE | FuzzyMLE(后续改进线)
  7. smarx.com. Convergent Encryption and Why No One Uses It. 2020.
  8. 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 的域分离均为候选。