基于密码
基于密码实现用户注册与登录。
错误做法
- 以纯文本存储密码不是一个好主意,因为任何有内部访问权限的人都可以看到它们。
- 直接存储密码哈希值是不够的,因为它会被预先计算的攻击修剪,例如彩虹表。
正确做法
确保密码在整个传输、保存、校验过程中,密码都是不可见的。
保存流程
- [前端]用户输入密码,生成密码盐,连同用户 ID 一起保存到[后端]。
- [前端]将密码盐拼接到密码中,对拼接结果执行哈希,连同用户 ID 和 HASH 值保存到[后端]。
- [前端]密码保存完成。
校验流程
- [前端]用户输入密码,基于用户 ID 查询密码盐,[后端]返回密码盐给[前端]。
- [前端]将密码盐拼接到密码中,对拼接结果执行哈希,连同用户 ID 和 HASH 值提交给[后端]。
- [后端]在接收到用户 ID 和 HASH 值后,基于用户 ID 查询已存储的 HASH 值,然后比较两个 HASH 值。
- [后端]将比较结果返回该前端,密码校验完成。
相关逻辑
- 用户 ID:用户唯一标识,可以是邮箱,也可以是由后端生成的唯一 ID。
- 生成密码盐:根据 OWASP 指南,“密码盐是一个独特的、随机生成的字符串,作为散列过程的一部分被添加到每个密码中”。比如 UUID。
- 保存密码盐:盐本身并非秘密,它可以以纯文本形式存储在数据库中。它用于确保哈希结果对每个密码都是唯一的。
- 哈希函数:密码学文本摘要算法,如 SHA256 中的
Encrypt.hash
。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.