Expand description
树形模式:逐文件加密并保持目录结构(文档 05 §3,决策 D-05)。
§与容器模式的关系
这是文档 05 §1 里两种文件夹模式中的模式 B。容器模式
(crate::pack)把整棵树塞进一个 .omy,树形模式在磁盘上保留结构:
明文 容器模式 树形模式
工作资料/ → a4332ff0.omy → MFZWIZLTOQ.omy/
├── 文档/ (单个文件) ├── NBSWY3DPFQ.omy/
│ └── 报告.docx │ └── ONXW2ZLUNBSGK.omy
└── 照片/ └── PB2GK3TUN5XA.omy/取舍不是「哪个更好」,两个方向都有人需要(所以 D-05 决定都做):
| 容器 | 树形 | |
|---|---|---|
| 目录结构 | 完全隐藏 | 泄露文件数、大小、树深度 |
| 改一个文件 | 重写整包 | 只重写那一个 |
| 云盘同步 | 每次全量 | 增量 |
| 单独分享一个文件 | 不行 | 可以 |
| 损坏影响面 | 头部坏了全丢 | 只影响那一个 |
§泄露的元数据必须告知用户(N6)
3.2 GB、1247 个文件的目录用树形模式加密后,旁观者能数出文件个数、看出 每个文件的大致尺寸、看出目录有几层。看不到名字和内容,但看得到形状。 「照片/2023/私人/」下躺着 400 个 2–5 MB 的文件,即使名字全是乱码也已经 说明了不少事。
这属于威胁模型 N6 已声明的非目标。UI 必须直说,不能让用户以为选了加密
就什么都藏住了——TreeReport::leak_notice 提供统一的告知文案。
§为什么遍历逻辑抽出来共用
打包时的几个决策——按名字稳定排序、用 symlink_metadata 而不是
metadata、跳过符号链接与非普通文件、深度上限——两种模式必须完全一致。
各写一份的话,哪天给容器模式修了「跳过 socket 文件」,树形模式还在按
老样子处理,同一个目录用两种模式加密会得到不同的内容集合。
所以 walk_dir 由本模块与 crate::pack 共用,判定规则只有一处。
Structs§
- Rekey
Params - 改写整棵树的钥匙时要一起传的那几项。
- Rekey
Report - 批量改密码的结果。
- Tree
Report - 树形模式加密的结果。
- Tree
Slots - 一棵树的槽位清单。
Functions§
- decrypt_
tree - 还原一棵加密目录树。
- encrypt_
tree - 加密一棵目录树。
- encrypt_
tree_ with_ media - 与
encrypt_tree相同,但为每个文件生成媒体附加信息。 - find_
any_ file - 在密文树里找任意一个加密文件,用来取 vault 参数。
- rekey_
tree - 给整棵密文树里的每个文件改密码(增删改),载荷一字节不动。
- rekey_
tree_ with_ progress - 同
rekey_tree,另外支持轮换文件密钥与进度上报。 - retry_
files - 只对给定的这些文件改密码,不碰目录名,也不遍历整棵树。
- tree_
remove_ slot - 在可管理模式下精确清掉某一个槽位。
- tree_
slots - 读取一棵树的槽位清单。
Type Aliases§
- Media
Extras Fn - 逐个文件的媒体附加信息回调。
- Rekey
Progress Fn - 进度回调:
(当前文件名, 第几个, 共几个, 该文件已处理字节, 该文件总字节)。