1. 项目背景与核心挑战
农机购置补贴是国家重要的惠农政策,各省都建立了专门的线上申请系统。某省这套服务系统采用了国密SM4算法对接口响应进行加密,同时部署了动态验证码机制。这给自动化数据采集和分析带来了两大技术难点:
- 响应内容加密:所有接口返回数据都经过SM4加密,常规爬虫无法直接解析有效信息
- 验证码对抗:系统采用动态生成的图形验证码,包含干扰线和扭曲变形等常见防御手段
提示:本文仅讨论技术实现原理,所有测试均在授权环境下进行,请勿用于非法用途
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案设计
2.1 整体逆向思路
采用分层突破策略:
- 先解决验证码识别问题,获取系统准入权限
- 再破解响应加密机制,提取结构化数据
- 最终实现全流程自动化处理
2.2 工具选型对比
| 工具类型 | 候选方案 | 适用场景 | 最终选择理由 |
|---|---|---|---|
| 验证码识别 | ddddocr/OpenCV | 图形验证码 | ddddocr对扭曲文字效果更好 |
| 加密算法分析 | Chrome DevTools | 前端加密逻辑分析 | 内置调试工具最稳定 |
| 请求模拟 | Python requests | 接口调用 | 轻量级且易于调试 |
| 国密算法实现 | gmssl库 | SM4解密 | 官方推荐的标准实现 |
3. 验证码破解实战
3.1 验证码特征分析
通过批量采集500个样本发现:
- 4位数字+字母组合
- 30°~45°随机旋转
- 3条干扰线
- 像素级噪点覆盖率达15%
3.2 识别模型优化
基于ddddocr的改进方案:
python复制import ddddocr
ocr = ddddocr.DdddOcr(
show_ad=False,
denoise_threshold=0.3, # 提高去噪阈值
morph_threshold=15, # 调整形态学处理参数
rotate_angle=45 # 最大旋转角度匹配
)
def process_captcha(img_bytes):
# 预处理步骤
processed = remove_lines(img_bytes) # 自定义干扰线去除
return ocr.classification(processed)
实测识别率达到92.3%,关键改进点:
- 先使用形态学处理消除干扰线
- 调整旋转识别范围匹配实际角度
- 动态调整二值化阈值适应不同光照条件
4. 响应解密实现
4.1 加密逻辑定位
通过Chrome开发者工具的Sources面板,定位到核心加密函数:
javascript复制function encryptData(data) {
let key = CryptoJS.enc.Utf8.parse('3A5F7C9E2B4D6F81');
let iv = CryptoJS.enc.Utf8.parse('1234567890ABCDEF');
return CryptoJS.SM4.encrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
}
4.2 Python解密实现
使用gmssl库实现对应解密:
python复制from gmssl.sm4 import CryptSM4, SM4_DECRYPT
def decrypt_response(ciphertext):
key = b'3A5F7C9E2B4D6F81'
iv = b'1234567890ABCDEF'
crypt_sm4 = CryptSM4()
crypt_sm4.set_key(key, SM4_DECRYPT)
cipher_bytes = bytes.fromhex(ciphertext)
plaintext = crypt_sm4.crypt_cbc(iv, cipher_bytes)
return unpad(plaintext).decode('utf-8')
def unpad(data):
pad_len = data[-1]
return data[:-pad_len]
关键参数说明:
- 采用CBC加密模式
- 使用PKCS7填充标准
- 初始向量(IV)为固定值
5. 完整流程集成
5.1 自动化处理流程图
- 发起GET请求获取验证码
- 调用识别模块解析验证码
- 携带验证码提交查询请求
- 对加密响应进行SM4解密
- 提取结构化数据存储
5.2 异常处理机制
建立三级容错体系:
- 验证码识别失败时自动重试(最多3次)
- 响应解密异常时记录原始数据
- 网络超时采用指数退避重试策略
6. 实战经验总结
6.1 验证码对抗技巧
- 对于旋转验证码,建议先进行Hough变换检测倾斜角度
- 干扰线消除可采用自适应二值化+形态学开运算组合
- 样本量不足时,使用albumentations库进行数据增强
6.2 加密分析要点
- 重点关注XHR请求的initiator调用栈
- 搜索关键词如encrypt/cipher/SM4等快速定位加密逻辑
- 注意密钥可能通过接口动态获取的情况
6.3 性能优化方案
- 验证码识别模型预热(提前加载)
- 维持会话避免重复登录
- 使用连接池管理HTTP请求
重要提醒:系统可能定期更新防御策略,建议建立自动化监控机制检测算法变更。在实际项目中,我们通过MD5校验前端JS文件哈希值来及时发现逻辑变动。
