Skip to content

用户登录流程说明文档

1. 总体流程

用户登录时,客户端与服务端通过“加盐+多次加密”的方式进行密码校验,确保密码传输和存储的安全性。流程如下:

  1. 客户端请求服务端获取 salt(盐值)。
  2. 客户端用 salt 对用户输入的密码进行加密处理。
  3. 客户端将加密后的密码和时间戳等信息提交到服务端。
  4. 服务端用相同的加密逻辑校验密码是否正确。

2. 详细流程

2.1 客户端流程

  1. 获取 salt

    • 客户端向接口 /user/get-salt?userName=xxx 发送请求,获取指定用户名的 salt。
    • 如果用户不存在,接口返回空,登录失败。
  2. 密码加密

    • 客户端将用户输入的明文密码与 salt 拼接,得到 password + salt
    • password + salt 进行一次 MD5 加密,得到 md5_1
    • 获取当前时间戳(如毫秒级)。
    • md5_1 与时间戳拼接,得到 md5_1 + timestamp
    • md5_1 + timestamp 再进行一次 MD5 加密,得到最终的加密密码 md5_2
  3. 提交登录请求

    • 客户端将用户名、最终加密密码(md5_2)、时间戳等参数提交到 /user/login 接口。

2.2 服务端流程

  1. 接收请求

    • 服务端接收用户名、加密密码、时间戳。
  2. 获取 salt 和数据库密码

    • 服务端根据用户名查找用户信息,获取该用户的 salt 和数据库中保存的密码(通常是 md5(password + salt))。
  3. 服务端加密校验

    • 服务端用数据库中保存的密码(即 md5(password + salt))与时间戳拼接,得到 md5_1 + timestamp
    • md5_1 + timestamp 进行 MD5 加密,得到 md5_2
    • md5_2 与客户端传来的加密密码比对。
    • 如果一致,则登录成功;否则登录失败。

3. salt 相关说明

  • salt 是每个用户唯一的、随机生成的字符串。
  • salt 在用户注册或设置密码时生成,存储在数据库中,与用户信息一同保存。
  • salt 不会频繁变化,只有在用户重置密码时才会重新生成。

4. 安全性说明

  • 即使两个用户使用相同的密码,因为 salt 不同,加密结果也不同。
  • 即使数据库泄露,攻击者也无法直接通过彩虹表等方式破解密码。
  • 多次加密和引入时间戳,有效防止了重放攻击和简单的暴力破解。

5. 时序图(简化)

mermaid
sequenceDiagram
    participant 客户端
    participant 服务端

    客户端->>服务端: /user/get-salt?userName=xxx
    服务端-->>客户端: 返回 salt
    客户端->>客户端: 明文密码+salt,MD5加密
    客户端->>客户端: 拼接时间戳,再MD5加密
    客户端->>服务端: /user/login?userName=xxx&passWord=md5_2&timestamp=ts
    服务端->>服务端: 查找salt和数据库密码
    服务端->>服务端: 用同样算法生成md5_2
    服务端->>服务端: 比对md5_2
    服务端-->>客户端: 登录结果

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer