2. 账号安全基础
撞库(Credential Stuffing)之所以长期有效,并不是因为攻击者掌握了多么高深的漏洞利用技术,而是因为账号安全体系中的三个基础环节——身份认证、密码存储与会话管理——在真实系统中经常被割裂设计。攻击者利用的正是这三者之间的缝隙:一次泄露的密码在其他站点仍然可用,认证接口缺乏足够的异常识别,会话令牌在认证成功后缺乏与风险等级的绑定。理解这三者的关联,是构建撞库检测能力的前提。
一、核心原理:认证、存储与会话的信任链条
身份认证回答的是“你是谁”,密码存储回答的是“如何在不保存明文的前提下验证你”,会话管理回答的是“验证通过后如何持续信任你”。三者构成一条信任链条:
- 认证环节:接收凭据(用户名/密码、验证码、设备指纹等),调用密码校验逻辑,决定是否发放会话。
- 存储环节:以哈希加盐等方式保存密码派生值,决定单次泄露的破坏半径。若使用可逆加密或弱哈希,泄露即等于明文扩散。
- 会话环节:认证成功后签发 Cookie、 或 Session ID,后续请求凭此免密访问。会话若长期有效、不绑定设备或 IP 风险,则撞库成功后可持续利用。
撞库攻击的典型路径是:攻击者从外部泄露库获取“用户名+密码”组合,批量向目标站点认证接口发起登录请求。若目标站点密码存储方式与来源站点相同或用户复用密码,则认证通过;认证通过后,攻击者立即获取会话令牌,完成后续操作。因此,检测撞库不能只看登录失败次数,还要看认证成功率、密码存储强度与会话签发行为之间的关联。
关键结论:撞库检测的本质是识别“认证请求的分布异常”与“认证成功后的会话滥用”之间的关联,而不是孤立地统计失败次数。
二、方法流程:从认证日志到会话风险的关联分析
在实际检测中,建议按以下流程建立关联分析能力:
- 采集认证日志:记录每次登录尝试的时间、源 IP、User-Agent、用户名、认证结果、失败原因。
- 标记密码存储强度:确认系统使用 Argon2、bcrypt 或 PBKDF2 等慢哈希,并记录盐值与迭代参数,评估泄露后的可破解成本。
- 关联会话签发:将认证成功事件与会话创建事件关联,记录会话 ID、有效期、绑定设备指纹或 IP。
- 计算异常指标:如单位时间失败率、失败后成功比例、同一 IP 尝试的用户名数量、同一用户名来自不同 IP 的成功登录。
- 触发分级响应:低风险仅记录,中风险要求二次验证,高风险直接阻断并吊销会话。
下面是一段用于关联认证失败与会话签发的伪代码示例,展示如何从日志中提取撞库特征:
# 从认证日志中提取撞库特征
def extract_stuffing_features(auth_logs, session_logs):
features = {}
for ip, events in group_by_ip(auth_logs).items():
fail_count = count(events, result="FAIL")
success_count = count(events, result="SUCCESS")
distinct_users = distinct(events, field="username")
features[ip] = {
"fail_rate": fail_count / len(events),
"success_after_fail": success_count / max(fail_count, 1),
"user_spread": distinct_users / max(len(events), 1),
"session_created": count(session_logs, ip=ip)
}
return features
当某个 IP 的 user_spread 高、fail_rate 高但 success_after_fail 也异常时,应重点排查是否为撞库。若该 IP 同时创建了多个会话,则说明攻击已进入会话利用阶段。
三、案例/场景:一次典型的撞库链路复盘
某电商平台在促销期间发现登录接口失败率上升,但未触发告警,因为失败次数未超过阈值。安全团队随后关联分析发现:
| 指标 | 正常时段 | 异常时段 | 说明 |
|---|---|---|---|
| 登录失败率 | 12% | 38% | 失败率上升但未达阈值 |
| 失败后成功比例 | 0.3% | 4.7% | 说明部分密码组合有效 |
| 单 IP 尝试用户名数 | 1.2 | 23.5 | 典型的撞库扫描特征 |
| 会话创建数 | 与成功数一致 | 成功数 1.8 倍 | 存在会话重复签发或复用 |
进一步排查发现,该平台密码存储使用 MD5 加固定盐,泄露后极易被彩虹表破解;会话令牌有效期为 30 天且不绑定设备。攻击者利用从其他站点泄露的密码库,成功登录约 2000 个账号,并利用长期会话令牌持续访问用户订单数据。复盘结论是:密码存储强度不足放大了撞库成功率,会话管理宽松放大了撞库后的危害。
警示:仅依赖登录失败次数阈值会漏报低速撞库。攻击者常控制单 IP 请求频率,使失败率缓慢上升,从而绕过传统告警。
四、误区与复盘:常见认知偏差
- 误区一:撞库只是登录接口的问题。实际上,密码存储强度决定了撞库的“命中率”,会话管理决定了撞库的“收益”。只加固登录接口而不升级密码存储,等于只堵了一半的洞。
- 误区二:加了验证码就能防住撞库。验证码可被自动化工具绕过或人工打码平台破解,且对已泄露密码的复用无效。验证码应作为分层防御的一环,而非唯一手段。
- 误区三:会话令牌只要加密就安全。加密只保证传输安全,不解决令牌长期有效、不绑定风险上下文的问题。撞库成功后,攻击者可直接复用令牌,绕过再次认证。
- 误区四:密码哈希加盐就足够。盐只防止彩虹表批量破解,不防止针对单个账号的暴力破解。必须使用慢哈希并设置合理迭代次数。
复盘建议:每次撞库事件后,应同时检查三项指标——认证接口的异常检测覆盖率、密码存储算法的迭代参数、会话令牌的有效期与绑定策略。三者缺一不可。
综上,身份认证、密码存储与会话管理不是三个独立模块,而是撞库攻击链上的三个关键节点。检测撞库时,必须将认证日志、密码存储强度与会话签发行为放在同一分析框架中,才能从“发现失败”升级为“识别成功后的滥用”,真正提升账号安全防护的有效性。