Skip to main content

Module tree

Module tree 

Source
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§

RekeyParams
改写整棵树的钥匙时要一起传的那几项。
RekeyReport
批量改密码的结果。
TreeReport
树形模式加密的结果。
TreeSlots
一棵树的槽位清单。

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§

MediaExtrasFn
逐个文件的媒体附加信息回调。
RekeyProgressFn
进度回调:(当前文件名, 第几个, 共几个, 该文件已处理字节, 该文件总字节)。