登录安全:重放攻击与防御策略
| 技术现在的应用系统中,大部分密码存储都是采用 md5 加密后存储,常用的登录基本流程如下:
- 前端 web 页面用户输入账号、密码,点击登录
- 请求提交之前,web 端首先通过客户端脚本对密码原文进行 md5 加密
- 提交账号、md5 之后的密码
- 后端验证账号与密码是否与数据库中的一致
这种流程看似安全,但实际上存在重放攻击风险!
什么是重放攻击?
监听者无需解密出密码明文即可登录!监听者只需将监听到的 URL 重放一下,即可冒充身份登录。这就是重放攻击(Replay Attack)。
防御方案一:随机令牌(Nonce)
- 进入登陆页面时,生成一个随机码(称之为令牌),在客户端页面和 session 中各保存一份
- 客户端提交登录请求时,将 md5 之后的密码与该随机码拼接后,再次执行 md5,然后提交
- 后端接收到登录请求后,将从数据库中查询出的密码与 session 中的随机码拼接后,md5 运算,然后与前端传递的结果进行比较
这种方案即使登录请求被监听到,回放登录 URL,由于随机码不匹配,无法登录成功。
防御方案二:固定盐值
为防止密码明文泄露,可以使用固定盐值:
- 系统设置一个固定的盐值,最好足够复杂
- 用户注册、修改密码时,将用户的原始密码与固定盐值拼接,然后做 md5 运算,保存进数据库
- 登录时,将用户的原始密码与固定盐值拼接,然后做 md5 运算,运算后的结果再拼接上随机码,再次 md5 运算,然后提交
- 后端比较
防御方案三:CSRF 令牌
使用 CSRF 令牌(Synchronizer Token Pattern):
- 服务器为每个用户会话生成一个唯一的、不可预测的令牌
- 令牌嵌入到表单中作为隐藏字段
- 提交时验证令牌是否匹配
防御方案四:Session 固定防护
- 登录成功后重新生成 Session ID
- 使用 Cookie 属性:HttpOnly、Secure、SameSite=Lax
其他安全措施
- 登录验证码:预防暴力登录破解,设置密码输入错误次数达到3次后出现验证码
- 账户锁定:密码输入错误次数达到一定量后(如6次),锁定账号,一小时后自动解锁
- HTTPS 传输:确保所有登录请求都通过 HTTPS 传输