cryptomator 中文文档 下载 App

主密钥与 scrypt 派生 —— 为什么 Recovery Key 能安全找回

主密钥:每次解锁都在用的那把"真钥匙"

每个 Cryptomator 保险库有两把独立的 256 bit 密钥,合在一起 512 bit:

这两把密钥才是真正的加密引擎。你的密码不直接用来加密文件——密码只用来派生一个 KEK(Key-Encryption Key,密钥加密密钥),然后用这个 KEK 把主密钥包裹起来(AES Key Wrap),存进 masterkey.cryptomator。所以:

KEK 派生流程图
KEK 派生后从 masterkey.cryptomator 解包出两把主密钥的流程

CSPRNG:主密钥怎么生成的

Cryptomator 的主密钥由密码学安全伪随机数生成器(CSPRNG)生成:

三条路径都依赖各自平台的系统级 CSPRNG,不使用自建的伪随机算法。这是整个信任链的基础——密钥生成没有可预测性。

scrypt:为什么它在抗暴力破解

KEK 的派生用 scrypt(由 Colin Percival 设计的密码哈希算法),参数:

参数值含义
cost32768计算 scrypt 的迭代轮数(N=2^15)
blockSize8内存占用量控制
parallel1并发度(Cryptomator 固定单线程,防止计时侧信道)
dkLen32输出 KEK 的长度 = 32 bytes = 256 bit

scrypt 的关键设计是同时吃 CPU 和内存。暴力破解一个 8 字符密码:

如果你的密码是 4 个随机单词拼起来(Diceware),scrypt 派生后攻击者连一个都解不开。这也是官方推荐使用密码短语而不是短密码的原因。

AES Key Wrap:为什么这叫"包裹"不叫"加密"

主密钥不直接用 AES-256 加密——而是用 AES Key Wrap(RFC 3394,又称 AES KWP,Key Wrapping with Padding)。Key Wrap 专为"用一把密钥包裹另一把密钥"设计:

Key Wrap 比传统的 "AES 加密 + HMAC" 更紧凑、更高效,而且它本身带 integrity tag,防篡改。

Recovery Key:主密钥的人类可读形式

Recovery Key 是一串12 词的人类可读英文单词序列(类似 BIP39)。它不是密码、也不依赖当前的保险库密码——它是加密主密钥的直接派生形式。这就是为什么:

  1. Recovery Key 可以重置当前密码(因为知道它就等于知道主密钥,可以换一个新密码重新派生 KEK 包裹主密钥)
  2. Recovery Key 独立于密码(改密码后旧 Recovery Key 依然有效)
  3. Recovery Key 不破坏加密(它只是人类可读的主密钥表示,攻击者拿到 Recovery Key 就等于拿到主密钥本体,可以解开所有文件)

把 Recovery Key 当密码一样保护。它可以完全绕过密码来访问你的保险库。

更详细的 Recovery Key 使用流程见 生成恢复密钥 和 丢失恢复与保险库抢救。