登陆注册体系的安全手段
目录
前言
Web 应用在登录界面中很可能会遭受黑客的攻击以获取特定的账号的密码。本文简述一些常见手段来抵御黑客的攻击行为。 就算无法做到彻底的安全,但通过极大增加试错成本,来近似达到安全目标。
基础
注册阶段
在用户注册时,可以强制性让用户输入强密码(毫无疑问,会降低用户体验),策略包含:
- 限制最小长度,比如:不低于 8 位密码。
- 必须包含大小写字母,数字,特殊字符。
- 检测弱密码,比如禁止 Passw0rd,123@456abc 这种有规律的弱密码。
密码加盐存储
用户往往会采用同一个密码,注册多个不同平台,这样就会导致一个风险:一旦某一个平台的数据库泄露,那么该用户的注册过的其他平台就有可能收到撞库攻击。
密码从用户在 Web 页面输入后,从存储到数据库,再到数据库中读取,包括日志记录,都应该是加密的,而不是明文读写密钥。
所以,后台网站存储密码的一个基本要求是:密码除了用户本人之外,没有任何人能够直接看到密码明文,这也就是为什么在修改密码这一功能中,网站无法把用户遗忘的密码直接发送给用户,而是只允许用户遗忘密码后进行重置的原因。
加密存储的策略主要是哈希函数,哈希函数是一种 数据摘要 函数,可以把 任意长度的数据 映射成 固定长度的值 。
输入:任意大小的数据。 输出:固定长度的哈希值。
哈希函数的特点: 1. 确定性:相同输入一定产生相同输出。 2. 抗碰撞:不同输入 尽量 不会导致相同输出,只要改变输入的一个字符,最终的结果最好完全不一样。 3. 单向性:从哈希值无法反推出原始数据。
常见的哈希函数有以下几种: 1. MD5,输出 128 位 2. SHA-1,输出 160 位 3. SHA-256,输出 256 位 4. SHA-512,输出 512 位
攻击方式
如果存储在数据库的所有密码都采用哈希函数计算后存储,黑客拿到数据库后,有以下一些攻击方式:
暴力穷举
遍历所有密码的可能性,逐一计算可能密码的哈希值进行比对。该方法的缺点是耗时久,但是对于 MD5 和 SHA-1 很有效果,因为这两个函数计算耗时小。
彩虹表攻击
彩虹表是一种预先计算好的哈希值与其对应的明文密码的查找表。该方法的缺点是占用磁盘空间大,主流彩虹表都是上百GB。
碰撞攻击
找到两个不同的输入,但是经过哈希计算后,产生了相同的输出。该方法目前主要用于构造图片,文件,二进制流的哈希碰撞,对于密码而言是没啥用的。 碰到网络文件下载,文件校验采用的是 MD5 来校验是否被篡改,需要多留意。
防御策略
针对黑客暴力穷举的策略是采用 Argon2、BCrypt 这种专用的密码哈希函数,它们被设计成计算成本高、耗时长、资源消耗大,即使攻击者获得了哈希值,也难以通过暴力穷举破解原始密码。
慢哈希的最终的目标是把哈希函数的速度降到足以让攻击者望而却步,但造成的延迟又不至于引起用户的注意。
针对彩虹表的策略是采用加盐(Salt)加密的方式,加盐的过程如下:
- 用户注册时,随机生成一个盐值(Salt)。
- 把用户密码和盐拼接,然后对拼接结果进行哈希。
加盐的注意点如下:
- salt 需要足够随机,确保为每一个用户都随机生成一个 salt。
- salt 需要足够长,一般至少 128 位(16字节)以上。
加盐使得通用彩虹表彻底失效,本质上是对用户选择的密码加入随机值,导致彩虹表计算出来的结果无效。
所以为了抵御这些攻击,需要选择慢哈希函数,并且加盐。
登陆阶段
登陆失败 N 次后,触发图形验证码、短信/邮箱验证码或者触发冻结账号的指令,防御脚本暴力破解。
对登录时候的 IP、User-Agent 进行记录,限制同一 IP 单位时间内请求登录接口的次数。
登陆失败时,对失败原因进行模糊化提示,不要明确的告诉客户端是用户名还是密码出错了。
进阶
只要完成了基础部分的检查和防御策略的实施已经能应付大部分的攻击了。不过对于安全性要求极高的系统,依然还有很多措施和手段。
- 多因素认证 (MFA):结合短信/邮箱验证码、TOTP(如 Google Authenticator)
- 异地登录提醒:登录来源异常时邮件/短信通知用户
- 会话并发限制:限制账号同时在线设备数
- 登录日志审计:记录成功/失败的 IP、UA、地理位置,供用户查看
- 设备指纹识别:结合浏览器指纹/硬件信息,检测新设备登录
- 单点登录 SSO
参考
- https://www.cnblogs.com/makai/p/11130703.html
- https://crackstation.net/hashing-security.htm
- https://www.cmd5.com/default.aspx