Expand description
主密钥工厂:从 32 字节主密钥派生各算法独立子密钥,避免同一密钥跨算法复用
(对应 PHP 版 EncryptionManagerFactory)。
§两套派生方案
共同的不变量:每个算法一把独立子密钥 —— 同主密钥 + 同标签恒得同一子密钥, 不同算法(标签与构造都不同)的子密钥互不相通,因此密钥永不跨算法复用。 两套方案只在构造与冻结状态上不同:
- 旧标签(五个默认算法,冻结):
子密钥 = HMAC-SHA256(key = 主密钥, msg = 用途标签),16 字节密钥取派生 结果前 16 字节。这五个标签自 1.x 起被存量密文绑定 —— 改标签或改参数顺序 都会让存量数据再也解不开,故永不改动。也不复刻原版历史遗留的 v1 反序方案 (标签作 key)—— 本 crate 采用 Rust 独立格式。 - 扩展标签(九个扩展算法):HKDF-Expand(RFC 5869),域与旧标签隔离:
PRK = HMAC-SHA256(key = 主密钥, msg = "dgn:derive-ext")(扩展域专用 PRK,标签同样不承载秘密),子密钥 = HKDF-Expand(PRK, info = 标签, L = 密钥长度)。
扩展为何用 HKDF 而非再截一段 HMAC:Threefish-512 需要 64 字节密钥,单次 HMAC-SHA256 只给 32 字节;HKDF-Expand 正是「一次提取、按需多块展开」的标准 构造(上限 255 × 32 字节),不必为超出块长的情形自造串联规则。
扩展标签统一命名 dgn:derive-ext:<注册标识>,与旧标签(dgn:derive: 前缀、
无 -ext)以及彼此都不重名。