验证码系统的目的是:阻止自动化脚本访问网页资源,验证访问者是否为真实人类用户。
它通过各种测试(图像、行为、计算等)判断请求是否来自机器人。
一、验证码系统的整体架构
验证码系统通常由 客户端 + 服务端 + 风控模型 + 数据采集 四大部分组成:
[用户浏览器/App]
↓ 加载验证码组件(图形/UI/JS)
[客户端模块]
↓ 采集行为数据(鼠标、滑动、指纹)
[行为加密&验证模块]
↓ 加密行为参数 + 加 challenge 提交
[服务端风控系统]
↓ 分析行为数据 + 评分/分类/判断
[验证结果]
→ 通过则返回 token → 前端提交业务系统验证
二、验证码的分类体系
类型 | 示例 | 验证机制 | 是否人机交互 |
---|---|---|---|
文本识别类 | 扭曲字符、算术题 | OCR识别 / 计算 | ✔ |
图像识别类 | 点选图(reCaptcha/hCaptcha) | 模型识别图片内容 | ✔ |
滑块验证类 | 极验、阿里滑块 | 拖拽缺口对齐判断轨迹 | ✔ |
行为分析类 | Turnstile、reCAPTCHA v3 | 无人操作 → 依赖设备+行为特征 | ✘ |
游戏式验证 | FunCaptcha | 拖动拼图/旋转图 → 交互行为 | ✔ |
生物识别类 | 人脸、指纹、声纹等 | 摄像头/麦克风采集+比对 | ✔ |
三、验证码的验证流程
以典型图形验证码为例,完整交互过程如下:
页面加载阶段
前端引入第三方验证码 SDK
向验证码服务获取初始化参数(如
sitekey
,challenge
,session_id
)
用户行为阶段
显示滑块/图片题/UI等
记录用户操作行为(鼠标轨迹、点击、拖拽等)
使用 JavaScript 加密行为数据(AES/RC4/混淆)
客户端提交阶段
将加密参数发送到验证码验证接口(带上
challenge
,payload
,action
,fingerprint
等)
服务端分析阶段
解密行为数据
分析用户设备、行为、指纹
利用机器学习模型判断:人类 / Bot / 可疑
返回结果阶段
验证通过 → 返回
token
否则重新触发图形验证、或提示验证失败
业务系统验证阶段
客户端将
token
提交给后端 API后端使用
secret
进行 token 验签验签通过 → 放行业务请求
四、行为采集机制详解
验证码不只是看用户点没点对,它更关注用户的“行为像不像人”:
常见采集行为
类型 | 内容举例 |
---|---|
鼠标轨迹 | 移动速度、加速度、反向次数等 |
滑动轨迹 | 抖动、停顿点、轨迹长度等 |
键盘输入节奏 | 间隔时间、回删频率等 |
触控行为 | 角速度、手指个数、缩放操作等 |
传感器信息 | 陀螺仪、加速度、磁力 |
浏览器指纹 | UA、插件、分辨率、字体等 |
五、验证码核心参数解析
参数名称 | 描述 |
---|---|
sitekey |
前端公钥(客户站点唯一) |
challenge |
当前验证码挑战标识 |
payload /w |
加密的行为数据或设备参数 |
token |
验证成功后生成的令牌 |
action |
当前操作意图(如 login、submit) |
response |
客户端结果 → 服务端验签 |
六、验证码安全机制概述
验证码系统一般包含如下几层防护:
机制 | 功能描述 |
---|---|
加密行为数据 | 防止伪造用户操作 |
Token 签名机制 | 保证结果不可伪造(通常带有签名) |
一次性令牌 | Token 单次有效、短时间内过期 |
滑动轨迹建模 | 检测是否真实人类操作轨迹 |
指纹反爬策略 | 检测设备环境、脚本执行、模拟行为 |
七、典型验证码厂商及特点对比
厂商 | 验证方式 | 特点 |
---|---|---|
Google reCAPTCHA | 图题/Invisible/v3 | v3使用评分机制,不打断操作 |
hCaptcha | 图题 | Cloudflare默认,图像模型复杂 |
Arkose FunCaptcha | 游戏题/拖动 | 使用行为交互 + WebGL 识别 |
极验 | 滑块 + 拼图 + 行为 | 支持定制风控策略,行为分析强 |
Cloudflare Turnstile | 无感验证 | 自动行为分析,不打断操作 |
阿里滑块 | 滑块 + 图文 | 滑动拼图、行为轨迹强校验 |
八、验证码对抗与破解思路
1)数据采集与还原
使用抓包工具(mitmproxy/Fiddler)
获取前端请求参数结构
找到
payload/w/blob
等行为参数
2)JS 解密分析
使用 Babel 对混淆 JS 解码
找到行为数据采集与加密的函数
Hook 核心逻辑:如滑动轨迹加密器、token 构造器
3)构造自动化模拟环境
使用 Puppeteer/Selenium 模拟人类操作
配合 stealth 插件隐藏自动化痕迹
模拟鼠标轨迹/触控轨迹/拖动行为等
4)打码/识图模块
针对图形题,使用:
2Captcha、CapMonster
OCR 自定义识别
模型训练(YOLO/ResNet)
九、如何设计一个验证码系统
如果要自己设计一个验证码系统,应该包含:
模块 | 技术点 |
---|---|
前端模块 | React/Vue + Canvas/WebGL 渲染 |
行为采集 | JS 监听器收集鼠标/滑动/传感器数据 |
加密模块 | AES/RC4 + 自定义混淆 + JS 加密函数 |
风控服务 | 使用 Python/Go/Java 训练行为分类模型 |
验证接口 | 接收行为数据、验证逻辑、签名 token 发回 |
后端验签 | 客户业务系统使用 secret 进行 token 验签 |
十、总结
验证码系统 = 前端 UI + 行为加密 + 后端风控判断 + 业务接口联动,是整个风控体系的一部分。
模块 | 破解思路 |
---|---|
前端行为 | 模拟人类轨迹/点击/触控 |
参数加密 | Babel 解混淆 + hook 分析 |
token 构造 | 重放、伪造、hook 构造函数 |
后端验证 | 抓包分析 token 签名接口,测试逻辑 |