用户登录流程说明文档
1. 总体流程
用户登录时,客户端与服务端通过“加盐+多次加密”的方式进行密码校验,确保密码传输和存储的安全性。流程如下:
- 客户端请求服务端获取 salt(盐值)。
- 客户端用 salt 对用户输入的密码进行加密处理。
- 客户端将加密后的密码和时间戳等信息提交到服务端。
- 服务端用相同的加密逻辑校验密码是否正确。
2. 详细流程
2.1 客户端流程
获取 salt
- 客户端向接口
/user/get-salt?userName=xxx发送请求,获取指定用户名的 salt。 - 如果用户不存在,接口返回空,登录失败。
- 客户端向接口
密码加密
- 客户端将用户输入的明文密码与 salt 拼接,得到
password + salt。 - 对
password + salt进行一次 MD5 加密,得到md5_1。 - 获取当前时间戳(如毫秒级)。
- 将
md5_1与时间戳拼接,得到md5_1 + timestamp。 - 对
md5_1 + timestamp再进行一次 MD5 加密,得到最终的加密密码md5_2。
- 客户端将用户输入的明文密码与 salt 拼接,得到
提交登录请求
- 客户端将用户名、最终加密密码(
md5_2)、时间戳等参数提交到/user/login接口。
- 客户端将用户名、最终加密密码(
2.2 服务端流程
接收请求
- 服务端接收用户名、加密密码、时间戳。
获取 salt 和数据库密码
- 服务端根据用户名查找用户信息,获取该用户的 salt 和数据库中保存的密码(通常是
md5(password + salt))。
- 服务端根据用户名查找用户信息,获取该用户的 salt 和数据库中保存的密码(通常是
服务端加密校验
- 服务端用数据库中保存的密码(即
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×tamp=ts
服务端->>服务端: 查找salt和数据库密码
服务端->>服务端: 用同样算法生成md5_2
服务端->>服务端: 比对md5_2
服务端-->>客户端: 登录结果