← 中文资源

简体中文版本

密码哈希

密码哈希使用 Argon2id、bcrypt 或 scrypt 生成加盐的慢速校验值;快速哈希与可逆加密都不适合存储密码。

阅读英文原文

工作原理

密码哈希是单向且刻意缓慢的函数。服务器为每个用户生成随机盐,与密码组合后交给 Argon2id、bcrypt 或 scrypt 等内存硬算法,并存储算法、参数、盐和摘要。验证时重新计算哈希,并以常量时间比较。盐抵御预计算彩虹表,成本参数让离线爆破变得昂贵。

使用场景与权衡

只要存储密码或从密码派生密钥,就应使用密码哈希,绝不要加密密码,因为加密可逆且密钥会成为单点故障。优先使用 Argon2id;bcrypt 成本至少为 12,且输入不得超过 72 字节。提高成本会同时消耗服务器 CPU 和内存,可能被用作拒绝服务杠杆。Argon2id 需要按实例调优内存,bcrypt 没有内存硬性;使用 KMS 保存的 pepper 可增加纵深防御,但会增加轮换复杂度。哈希无法阻止弱口令撞库,还应配合限流和泄露密码库检查。

示例与误区

const hash = await argon2.hash(password, {
  type: argon2.argon2id,
  memoryCost: 19456,
  timeCost: 2,
});
const ok = await argon2.verify(hash, candidate);

加盐 SHA-256 仍然太快,不能用于密码;加密不是哈希;pepper 不能替代每用户盐;bcrypt 静默截断 72 字节会削弱使用长口令的用户。相关概念包括密钥管理、静态数据加密和最小权限。