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)