Skip to main content

Module crypto

Module crypto 

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

Argon2Params
Argon2id 参数。
Fek
文件加密密钥(File Encryption Key)。
Kek
库主密钥(Key Encryption Key)。
SecretKey
32 字节密钥材料,析构时自动擦除。

Enums§

CipherId
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。