文档 密钥推导算法 Argon2id

# Argon2id

Argon2id 是一种内存困难型密钥推导函数，设计用于抵抗时间-内存权衡攻击和侧信道攻击。它在 2015 年被选为密码哈希竞赛（PHC）的获胜算法，并由 RFC 9106 定义。VeraCrypt 支持将 Argon2id 作为 PBKDF2-HMAC 的替代方案用于非系统卷头密钥推导。

### 主要特性

- 内存困难：需要可配置数量的内存，从而提高对专用硬件攻击的抵抗能力。
- 抗侧信道攻击：结合了依赖数据和不依赖数据的内存访问模式。
- 内部哈希函数：内部使用 BLAKE2b-512，无需单独选择哈希算法。
- 可调参数：允许调整内存成本、时间成本和并行度。

### Argon2 变体

Argon2 有三个变体：

- Argon2d：使用依赖数据的内存访问方式，可抵抗时间-内存权衡攻击，但更容易受到侧信道攻击。
- Argon2i：使用不依赖数据的内存访问方式，可抵抗侧信道攻击，但对时间-内存权衡攻击的抵抗力较弱。
- Argon2id：结合两种变体的混合方式，可同时抵抗两类攻击（VeraCrypt 使用此变体）。

### VeraCrypt 中的参数

VeraCrypt 使用 Argon2id 时采用以下参数配置：

#### 内存成本（m_cost）

密钥推导过程中使用的内存量由 PIM 值控制：

- 公式：m_cost(pim) = min(64 MiB + (pim - 1) × 32 MiB, 1024 MiB)
- 范围：64 MiB 到 1024 MiB（在 PIM = 31 时达到上限）
- 默认值：416 MiB（相当于 PIM = 12）

#### 时间成本（t_cost）

密钥推导过程中执行的迭代次数：

- 当 PIM ≤ 31 时：t_cost(pim) = 3 + floor((pim - 1) / 3)
- 当 PIM > 31 时：t_cost(pim) = 13 + (pim - 31)
- 默认值：6 次迭代（相当于 PIM = 12）

#### 并行度

计算过程中使用的并行线程数：

- 值：VeraCrypt 中始终固定为 1 个线程。
- 原因：确保在不同硬件配置上具有一致的行为。

### 相对于 PBKDF2 的优势

- 内存困难性：需要分配大量内存，使 GPU 和 ASIC 攻击成本更高。
- 现代设计：专门设计用于抵抗当代攻击方法。
- 抗侧信道攻击：内置对缓存计时和其他侧信道攻击的防护。
- 标准化：已在 RFC 9106 中正式标准化。

### 使用注意事项

在 VeraCrypt 中使用 Argon2id 时：

- 内存要求：请确保有足够的 RAM，尤其是在使用较高 PIM 值时。
- 性能：较高的内存成本可能导致挂载时间变慢，但可提供更好的安全性。
- 兼容性：适用于支持多种密钥推导函数的 VeraCrypt 版本。
- 无需哈希选择：与 PBKDF2-HMAC 不同，无需选择单独的哈希算法。

### 技术规格

算法：RFC 9106 定义的 Argon2id
内部哈希：BLAKE2b-512
盐值大小：512 位（与 PBKDF2-HMAC 相同）
头 KDF 输出长度：当前 VeraCrypt 格式固定为 1536 位（192 字节）。所选加密算法使用该输出中所需的前缀部分（例如 AES（AES-256-XTS）使用前 64 字节）。第三方实现必须先从 Argon2id 请求 192 字节，再选择所需前缀；如果只请求所选算法的密钥材料长度，将得到不同的 Argon2id 输出。
版本：Argon2 版本 0x13（十进制 19）
有关 PIM 值及其对 Argon2id 参数影响的更多信息，请参阅 个人迭代乘数（PIM）部分。