目标
密码哈希是一个汇率:用户每次登录多花的每毫秒,都是攻击者每次猜测要付的倍数。Argon2id 的参数就是旋钮,其中内存是最强的部分——GPU 的算力便宜、显存昂贵。在真实登录硬件上调参、把时延锚在 200 毫秒附近、并把参数编码进每个存储的哈希以便随时间增强。
步骤要点
- 在登录规格的机器上基准测试候选参数,记录单次哈希耗时(如 45ms)。
- 把内存提到 64 MiB、迭代 3、并行 4,测得约 200ms,落在 OWASP 建议的交互登录区间。
- 确认存储串自带参数($argon2id$v=19$m=65536,t=3,p=4$…),验证时按哈希逐条读取。
- 用 verify 校验样例哈希并对 /login 压测,确认并发与延迟同时达标。
- 登录成功后用 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>