2FA身份验证应用开发:如何正确存储用户提交的登录凭证
2FA实现流程安全优化与凭证存储方案
现有方案的核心风险
你当前设计的流程里把账号密码存入页面hidden inputs的做法存在严重安全漏洞:
- 任何形式的密码(明文/哈希)回传至前端都有泄露风险:前端所有可存储的位置(hidden input、localStorage、sessionStorage)都可以被XSS攻击读取,若未启用HTTPS,传输过程也会被中间人劫持获取
- 哪怕你对密码做哈希处理再存前端也没有意义:攻击者拿到哈希值之后可以直接代入第二步提交请求,等同于拿到了明文密码的同等权限
你的问题直接解答
- 明文存储是否安全?
完全不安全,绝对禁止任何场景下把用户明文密码存储在前端、或者回传给前端。 - 是否需要先做哈希处理?
不需要,哈希处理解决不了当前场景的问题,反而会增加无意义的开发成本,哈希仅适合用于服务端持久化存储密码时的不可逆加密,不适合用于临时登录流程的凭证存储。 - 是否应该存储在session中?
应该用服务端session存储临时状态,但不需要存储原始密码:
- 第一步账号密码校验通过后,直接在服务端session中记录三个信息即可:已通过密码校验的用户ID、2FA校验过期时间、待校验的2FA验证码(或验证码对应的校验凭证)
- 完全不需要存储原始账号密码,第二步用户提交验证码时,直接从session中读取用户ID,比对验证码是否匹配即可,不需要再二次校验账号密码
优化后的2FA流程建议
- 用户提交账号密码,服务端校验通过后,生成2FA验证码发送给用户,同时在服务端session写入「用户ID、2FA验证码、2FA过期时间」,返回2FA输入页
- 用户提交验证码,服务端首先校验session是否存在待验证的2FA记录,再比对验证码是否正确、是否过期,校验通过后清除session中的临时2FA记录,写入正式登录态
- 全程不要把账号、密码、2FA验证码的任何敏感信息返回给前端
服务端session安全配置要求
- 给session对应的cookie设置
HttpOnly属性,禁止前端JS读取cookie,防范XSS窃取session - 给session cookie设置
Secure属性,仅在HTTPS连接下传输cookie - 给session cookie设置
SameSite=Lax或Strict属性,防范CSRF攻击 - 2FA临时校验状态的过期时间设置为3-5分钟,超时自动失效,避免被冒用
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

