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)、记忆修复前备份。
This commit is contained in:
commit
ce8e6ceed9
396 files changed
+66045
No files matched your search
@@ -0,0 +1,219 @@
|
||||
# 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 的域分离**均为候选**。
|
||||
Reference in new issue
Block a user