← 中文资源

简体中文版本

调优 Argon2id 密码哈希参数

依据硬件预算与目标时延选定内存、迭代次数与并行度,并从登录体验与攻击成本两侧验证参数。

阅读英文原文

目标

密码哈希是一个汇率:用户每次登录多花的每毫秒,都是攻击者每次猜测要付的倍数。Argon2id 的参数就是旋钮,其中内存是最强的部分——GPU 的算力便宜、显存昂贵。在真实登录硬件上调参、把时延锚在 200 毫秒附近、并把参数编码进每个存储的哈希以便随时间增强。

步骤要点

  1. 在登录规格的机器上基准测试候选参数,记录单次哈希耗时(如 45ms)。
  2. 把内存提到 64 MiB、迭代 3、并行 4,测得约 200ms,落在 OWASP 建议的交互登录区间。
  3. 确认存储串自带参数($argon2id$v=19$m=65536,t=3,p=4$…),验证时按哈希逐条读取。
  4. 用 verify 校验样例哈希并对 /login 压测,确认并发与延迟同时达标。
  5. 登录成功后用 needsRehash 检查旧参数哈希并透明重哈希,免去全量重置战役。

排错提示

超出延迟预算先降 timeCost 再降内存,多核机器用并行度吸收内存成本,安全上的 100ms 比爽快 20ms 值钱;容器被内存参数压垮是因为每次验证都全量分配,把容器上限设到 memoryCost×峰值并发登录之上或对登录排队;跨运行时不兼容就统一走 argon2id 标准编码格式,参数随哈希可移植。

适用边界

交互式登录限死了参数上限,服务器间验证可以也应当用强得多的配置;哈希强度救不了弱口令,仍需配合泄漏口令库检查与限流。

代码示例

const stored = await argon2.hash(password, {
  type: argon2.argon2id,
  memoryCost: 65536,  // 64 MiB — the expensive part for GPUs
  timeCost: 3,
  parallelism: 4,
});
// stored: $argon2id$v=19$m=65536,t=3,p=4$<salt>$<digest>