场景

“忘记密码”如果能返回原密码,说明服务端保存了可逆明文或可解密副本;一旦数据库或密钥泄露,所有用户凭证会立即暴露。

原理

安全系统保存的是口令经盐和慢哈希函数计算后的验证值。登录时对输入使用相同参数计算并比较,服务端没有原文可读。独立随机盐阻止彩虹表复用,较高计算成本提高离线破解代价。

设计步骤

注册时使用 Argon2id、bcrypt 等成熟实现并保存算法版本、盐与成本参数;登录采用常量时间比较;忘记密码签发一次性、短时、绑定用户的重置令牌;重置成功后撤销旧会话并发送安全通知。

权衡

更高哈希成本提升抗破解能力,也增加登录 CPU 和拒绝服务风险,需要压测。通过邮件或短信重置方便,但安全性取决于外部账户;客服人工找回灵活,却容易遭遇社工攻击。

实践建议

全程使用 HTTPS,但不要把前端哈希当作服务端口令哈希替代。重置接口不泄露账号是否存在,令牌只保存哈希并限制尝试次数。定期评估成本参数,用户成功登录时渐进升级旧哈希;禁止在日志、埋点和异常中记录密码。

落地检查

上线前还应做一次桌面演练:准备正常、边界、超时、重复与恶意输入,确认系统的返回、日志和指标彼此对应;在预发布环境模拟依赖不可用、进程重启和配置回滚,验证降级路径不会放大故障。上线时采用小流量观察,提前定义停止条件与负责人。稳定后复盘真实数据,删除没有收益的复杂度,并把新发现的约束补进测试、监控和设计记录,使方案能够随业务持续演进,而不是停留在一次性评审结论。