Skip to main content

Module reencrypt

Module reencrypt 

Source
Expand description

真正的密钥轮换:换掉 FEK 并重新加密载荷。

§与 crate::keyslot 的分工

keyslot::rewrite_slots 改的是「谁能打开 这个文件」,FEK 与载荷密文一字节不变。这有一个用户很容易误解的后果: 移除一个密码只影响这一份文件。攻击者若留有旧副本,仍能用被移除的密码 打开那个副本——因为那份副本的 slot 区还是旧的,里面包裹的还是同一个 FEK。

本模块解决的正是这件事:换一个全新的 FEK、全新的 file_uuid 与 base_nonce,把载荷整个重新加密一遍。此后旧密码不但打不开这个文件, 旧密码派生出的 KEK 也不再对应任何有效的 FEK。

§代价必须如实告知

成本与文件大小成正比(文档 03 §4.3),不是毫秒级:

  • 全部密文字节都变了。对外部观察者是一个全新文件,增量备份要重传整份, 跨文件去重失效;
  • 大文件是数分钟到数小时的读写。

所以这不能做成密码管理的默认行为,只能是用户明确选择的另一个操作。

§它仍然挡不住什么

轮换只保证「今后拿到这一份文件的人」用旧密码打不开。已经流出去的旧副本 是一份独立的密文,它的 FEK 早已被旧密码包裹好,本操作对它无能为力。 唯一诚实的表述是:轮换让这份文件从此与旧密码无关,但不能收回已经泄露 的副本。UI 不能把它说成「彻底作废旧密码」。

Structs§

ReplacementMetadata
外部编辑后需要随新内容重建的媒体附加信息。
RotateOutcome
轮换的结果。

Functions§

replace_plaintext_preserving_slots
用新明文替换单文件载荷,同时逐字节保留原槽区。
rotate_fek
换掉 FEK 并重新加密整个载荷。
rotate_fek_with_progress
与 rotate_fek 相同,但分别回报解密与加密两个阶段的进度。