Expand description
密码学层:两级 KDF、AEAD 抽象、密钥材料的安全擦除。
§两级 KDF 是可行性前提,不是优化
规范要求「给定 N 个密码,快速判断某文件是否匹配」。实测(见验证报告 §3.2):
| 操作 | 耗时 |
|---|---|
| Argon2id (m=64MiB, t=3) | ~180 ms |
| HKDF-SHA256 | ~13 µs |
| 比值 | ~13,700× |
若每个文件都跑一次 Argon2,扫描 10,000 个文件需要约 2.5 小时;两级 KDF 下约 3.4 秒。
所以 Kek 必须在会话内缓存,绝不能每文件重新派生。
§域分隔
四种用途的子密钥使用互不相同的 HKDF info,确保任一密钥泄露不影响其它用途:
- slot 包裹密钥:
"omy/v1/slot" || u16le(slot_index),salt =file_uuid - 载荷密钥:
"omy/v1/payload",salt =file_uuid - 头部 MAC 密钥:
"omy/v1/header-mac",salt =file_uuid - TLV 密钥:
"omy/v1/tlv" || u16le(tlv_type),salt = 空
Structs§
- Argon2
Params - Argon2id 参数。
- Fek
- 文件加密密钥(File Encryption Key)。
- Kek
- 库主密钥(Key Encryption Key)。
- Secret
Key - 32 字节密钥材料,析构时自动擦除。
Enums§
- Cipher
Id - AEAD 算法选择。
Constants§
- KEY_LEN
- 对称密钥长度(字节)。
- NONCE_
LEN - 参考实现使用的 nonce 长度(ChaCha20-Poly1305 / AES-GCM 均为 12)。
- TAG_LEN
- AEAD 认证标签长度(字节)。
- ZERO_
NONCE - key slot 与 TLV 使用的全零 nonce。
Functions§
- chunk_
aad - 构造载荷块的 AAD。
- chunk_
nonce - 构造载荷块的 nonce。
- content_
hash - 计算 BLAKE2b-256 内容哈希。
- derive_
from_ secret - 从任意一把已有密钥再派生一把,用于给同一份秘密划分用途域。
- header_
mac - 计算头部 HMAC-SHA256。
- verify_
header_ mac - 以常量时间验证头部 MAC。