Expand description
真正的密钥轮换:换掉 FEK 并重新加密载荷。
§与 crate::keyslot 的分工
keyslot::rewrite_slots 改的是「谁能打开
这个文件」,FEK 与载荷密文一字节不变。这有一个用户很容易误解的后果:
移除一个密码只影响这一份文件。攻击者若留有旧副本,仍能用被移除的密码
打开那个副本——因为那份副本的 slot 区还是旧的,里面包裹的还是同一个 FEK。
本模块解决的正是这件事:换一个全新的 FEK、全新的 file_uuid 与
base_nonce,把载荷整个重新加密一遍。此后旧密码不但打不开这个文件,
旧密码派生出的 KEK 也不再对应任何有效的 FEK。
§代价必须如实告知
成本与文件大小成正比(文档 03 §4.3),不是毫秒级:
- 全部密文字节都变了。对外部观察者是一个全新文件,增量备份要重传整份, 跨文件去重失效;
- 大文件是数分钟到数小时的读写。
所以这不能做成密码管理的默认行为,只能是用户明确选择的另一个操作。
§它仍然挡不住什么
轮换只保证「今后拿到这一份文件的人」用旧密码打不开。已经流出去的旧副本 是一份独立的密文,它的 FEK 早已被旧密码包裹好,本操作对它无能为力。 唯一诚实的表述是:轮换让这份文件从此与旧密码无关,但不能收回已经泄露 的副本。UI 不能把它说成「彻底作废旧密码」。
Structs§
- Replacement
Metadata - 外部编辑后需要随新内容重建的媒体附加信息。
- Rotate
Outcome - 轮换的结果。
Functions§
- replace_
plaintext_ preserving_ slots - 用新明文替换单文件载荷,同时逐字节保留原槽区。
- rotate_
fek - 换掉 FEK 并重新加密整个载荷。
- rotate_
fek_ with_ progress - 与
rotate_fek相同,但分别回报解密与加密两个阶段的进度。