认证基础

认证基础从账号密码开始。它虽然传统,但仍然是多数系统的根身份入口。设计不好,后面的 Token、SSO、MFA 都会建立在不安全的地基上。

密码存储

密码绝不能明文存储,也不应该只做一次普通哈希。正确做法是使用带盐的慢哈希算法,例如 bcrypt、scrypt 或 Argon2:

password -> salt -> slow hash -> password_hash

数据库只保存 password_hash、算法版本和必要参数。这样即使数据库泄露,攻击者也无法直接拿到原始密码。

登录流程

基础登录流程可以分成几步:

  1. 用户提交账号和密码。
  2. 服务端按账号查找用户。
  3. 使用相同算法验证密码。
  4. 检查账号状态:是否冻结、是否未验证邮箱、是否需要重置密码。
  5. 创建会话或签发 Token。
  6. 记录登录日志和风险信号。

错误提示要谨慎。不要明确告诉攻击者“账号存在但密码错误”,可以统一提示“账号或密码错误”。

防暴力破解

登录接口是高风险入口,需要保护:

  • 同一账号连续失败后增加冷却时间。
  • 同一 IP 或设备失败过多时触发验证码。
  • 高风险地域或代理访问时要求二次验证。
  • 登录失败日志进入风控系统。

限流不能只按 IP,因为攻击者可以使用代理池;也不能只按账号,因为会影响被撞库的正常用户。通常要结合账号、IP、设备和行为特征。

注册与找回

注册和找回密码同样属于认证系统:

  • 注册时校验邮箱或手机号,避免无效账号泛滥。
  • 找回密码链接要短期有效、一次性使用。
  • 重置密码后应撤销旧会话。
  • 修改邮箱、手机号、密码前要验证当前身份。

认证基础的目标是把“证明身份”的第一步做扎实。下一章会讲 Token,解决登录成功后如何在后续请求中表达身份。