基于密码

基于密码实现用户注册与登录。

错误做法

  1. 以纯文本存储密码不是一个好主意,因为任何有内部访问权限的人都可以看到它们。
  2. 直接存储密码哈希值是不够的,因为它会被预先计算的攻击修剪,例如彩虹表。

正确做法

确保密码在整个传输、保存、校验过程中,密码都是不可见的。

20220508155305

保存流程

  1. [前端]用户输入密码,生成密码盐,连同用户 ID 一起保存到[后端]。
  2. [前端]将密码盐拼接到密码中,对拼接结果执行哈希,连同用户 ID 和 HASH 值保存到[后端]。
  3. [前端]密码保存完成。

校验流程

  1. [前端]用户输入密码,基于用户 ID 查询密码盐,[后端]返回密码盐给[前端]。
  2. [前端]将密码盐拼接到密码中,对拼接结果执行哈希,连同用户 ID 和 HASH 值提交给[后端]。
  3. [后端]在接收到用户 ID 和 HASH 值后,基于用户 ID 查询已存储的 HASH 值,然后比较两个 HASH 值。
  4. [后端]将比较结果返回该前端,密码校验完成。

相关逻辑

  • 用户 ID:用户唯一标识,可以是邮箱,也可以是由后端生成的唯一 ID。
  • 生成密码盐:根据 OWASP 指南,“密码盐是一个独特的、随机生成的字符串,作为散列过程的一部分被添加到每个密码中”。比如 UUID。
  • 保存密码盐:盐本身并非秘密,它可以以纯文本形式存储在数据库中。它用于确保哈希结果对每个密码都是唯一的。
  • 哈希函数:密码学文本摘要算法,如 SHA256 中的 Encrypt.hash