题目
设计抵御凭证填充攻击的安全认证系统
信息
- 类型:问答
- 难度:⭐⭐⭐
考点
认证安全,速率限制设计,凭证存储安全,异常检测机制
快速回答
防御凭证填充攻击的核心策略:
- 实施多层级速率限制(IP/账号/全局)
- 强制使用高强度密码策略和密码散列算法(Argon2id/bcrypt)
- 部署智能异常检测(设备指纹/行为分析)
- 整合多因素认证(MFA)关键操作
- 监控并共享威胁情报(IP信誉库)
攻击原理说明
凭证填充攻击(Credential Stuffing)是自动化利用泄露凭证的大规模攻击:
- 攻击者使用从其他网站泄露的账号密码组合(通常达数十亿条)
- 通过自动化工具(如Sentinel、Blackbullet)以每秒数百次尝试登录
- 依赖用户在不同平台重复使用相同凭证的行为模式
防御系统设计示例
# 多层级速率限制实现示例
from django_ratelimit.decorators import ratelimit
@ratelimit(key='ip', rate='10/m', block=True) # IP层限制
@ratelimit(key='post:username', rate='5/m') # 账号层限制
def login_view(request):
# 设备指纹生成(示例)
device_hash = hashlib.sha256(f"{request.META['HTTP_USER_AGENT']}-{request.META['REMOTE_ADDR']}".encode()).hexdigest()
# 异常检测逻辑
if detect_anomaly(request):
return HttpResponse("可疑活动检测", status=403)
# 密码验证(使用Argon2)
if check_password(request.POST['password'], stored_hash):
# 成功登录后重置计数器
reset_failed_count(request.POST['username'])
return HttpResponse("登录成功")
else:
# 记录失败尝试
log_failed_attempt(device_hash, request.POST['username'])
return HttpResponse("凭证错误", status=401)关键防御策略
1. 分层速率限制
- IP层限制:单个IP每分钟尝试≤10次
- 账号层限制:单账号每小时≤5次失败尝试
- 全局限制:整个系统每秒≤100次登录请求
2. 凭证安全存储
# 密码存储最佳实践
from argon2 import PasswordHasher
ph = PasswordHasher(time_cost=3, memory_cost=65536) # 抗GPU破解参数
stored_hash = ph.hash("用户密码") # 自动生成salt并包含算法参数3. 智能异常检测
- 设备指纹:结合UserAgent/IP/屏幕分辨率生成唯一标识
- 行为分析:检测异常登录时间/地理跳跃/输入模式
- 蜜罐账户:部署虚假账户诱捕攻击工具
常见错误
- 仅依赖基础验证码(可被AI破解)
- 在错误响应中泄露账号存在信息(统一返回"凭证错误")
- 使用弱哈希算法(如MD5/SHA1)或未加盐存储
- 忽略API端点的防护(攻击者常转向移动API)
扩展知识
- 进阶防护:
- WebAuthn无密码认证
- 基于风险的动态认证(如登录新设备强制MFA)
- 与HaveIBeenPwned等泄露数据库联动
- 攻击演进:
- 分布式攻击(使用Tor/代理IP池)
- 低慢速攻击(每分钟1-2次规避检测)
- 组合撞库(先测试账号存在性再攻击)