密码哈希Password Hashing)是把用户密码转换成可存储验证值的过程,目标是在数据库泄露后尽量提高攻击者离线猜密码的成本。

核心问题

系统不能明文保存用户密码。普通哈希虽然不可逆,但计算太快,攻击者拿到哈希库后可以用 GPU 或专用硬件高速试密码。密码哈希解决的是“既能验证用户输入,又尽量拖慢离线破解”的问题。

核心机制

现代密码哈希通常使用密码专用 KDF,而不是普通快速哈希。典型存储结构包含:

  • 算法版本:例如 Argon2id、bcrypt、scrypt、PBKDF2。
  • salt:每条记录独立生成,防止预计算和相同密码同哈希。
  • 成本参数:迭代次数、内存成本、并行度或工作因子。
  • 派生结果:用于登录验证的存储值。

验证时,系统用用户输入的密码、记录里的 salt 和成本参数重新计算,再用常量时间比较判断是否匹配。

工程用途

  • 账号密码登录:保存密码验证材料,而不是保存明文密码。
  • 离线密钥保护:从用户口令派生本地文件或钱包密钥。
  • 算法升级:登录成功后发现参数过旧,可以重新计算并迁移到更高成本。
  • 泄露缓解:即使数据库泄露,也让批量破解成本显著上升。

边界与常见坑

  • 不要用普通 SHA-256 直接哈希密码:它太快,适合完整性校验,不适合密码存储。
  • salt 必须每条记录不同:全局 salt 或固定 salt 不能阻止攻击者批量复用计算结果。
  • 成本参数要随时间升级:硬件变快后,旧参数会逐渐不够用。
  • 密码哈希不解决弱密码:仍需要限速、多因素认证、泄露密码检测和风控。
  • 不要自己设计算法:优先使用成熟库和标准参数,不要手写组合哈希轮次。
  • 错误信息要收敛:不要区分“用户不存在”和“密码错误”,避免枚举账号。

相关术语