Files
dsh_ai1net_server/docs/调研与审计/调研_MLE加密去重最优方案_20260918.md
T
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

220 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 的域分离**均为候选**。