FEATURED · 精选文章

招聘网站JS逆向实战:SM4加密与数据抓取解析

发布时间 / 2026/8/22 9:06:03
来源 / 创域科博编辑部
栏目 / 资讯中心
招聘网站JS逆向实战:SM4加密与数据抓取解析 1. 招聘网站JS逆向实战从加密分析到数据抓取第一次打开某招聘网站时我就被它复杂的参数加密机制吸引了兴趣。作为国内主流招聘平台之一它的反爬策略相当完善——请求参数经过多层加密核心逻辑被webpack打包混淆甚至还用上了国密算法。这种级别的防护对普通爬虫开发者来说确实是个不小的挑战。经过一周的逆向分析我成功破解了它的加密逻辑。整个过程涉及webpack模块分析、SM4/SM3算法逆向、动态参数生成等多个技术点。下面就把我的实战经验完整分享出来包括加密定位、算法还原和完整爬虫实现。无论你是刚接触JS逆向的新手还是想提升加密分析能力的老鸟这篇内容都会对你有所帮助。提示本文仅用于技术交流实际开发中请遵守robots.txt协议控制请求频率避免对目标服务器造成压力。2. 逆向分析准备与环境搭建2.1 目标网站加密特征识别打开Chrome开发者工具切换到Network面板观察请求特征所有包含关键数据的POST请求其请求体都是加密字符串请求头中包含x-sign、x-timestamp等自定义字段搜索接口返回的数据也是加密格式通过搜索接口的响应内容可以初步判断使用了国密算法。返回数据中包含sm4、sm3等关键词这与常见的AES、RSA加密有明显区别。2.2 逆向工具链配置工欲善其事必先利其器。我使用的工具组合如下Chrome DevTools基础调试工具用于断点调试和调用栈分析Fiddler/Charles抓包工具辅助分析网络请求WebStormJS代码分析IDE提供智能提示和重构功能Python环境最终爬虫实现需要安装pycryptodome库的国密算法支持特别提醒安装gmssl库时可能会遇到编译错误。推荐使用预编译版本pip install gmssl-prebuilt3. 加密逻辑逆向解析3.1 Webpack模块定位技巧现代前端项目普遍使用webpack打包我们的目标网站也不例外。逆向时首先要找到加密逻辑所在的模块在Sources面板搜索sm4、encrypt等关键词通过调用栈回溯加密函数的入口定位到webpack模块的加载器代码关键发现加密逻辑集中在编号为1e3的模块中。通过hook webpack的__webpack_require__函数可以提取出这个模块的完整代码。3.2 SM4加密算法分析SM4是我国商用密码标准中的分组加密算法。在目标网站中它被用于核心参数的加密使用CBC模式填充方式为PKCS7固定IV值为0123456789ABCDEF密钥通过SM3哈希算法动态生成加密流程伪代码function encryptData(data, key) { const sm4Key sm3Hash(key).substring(0, 32); return sm4.encrypt(data, sm4Key, {mode: cbc, iv: 0123456789ABCDEF}); }3.3 签名机制破解每个请求都需要携带x-sign签名头其生成逻辑如下拼接请求路径、时间戳和固定盐值对拼接字符串进行SM3哈希将哈希结果转为16进制字符串Python实现示例import gmssl def generate_sign(path, timestamp): salt fixed_salt_value # 实际分析中获得 raw_str f{path}|{timestamp}|{salt} sm3 gmssl.sm3.sm3_hash(bytes(raw_str, utf-8)) return sm34. 完整爬虫实现4.1 加密函数Python移植将JS加密逻辑完整移植到Pythonfrom gmssl import sm3, sm4 class ZhipinCrypto: def __init__(self): self.iv b0123456789ABCDEF def sm4_encrypt(self, data, key): crypt_sm4 sm4.CryptSM4() crypt_sm4.set_key(key, sm4.SM4_ENCRYPT) encrypt_value crypt_sm4.crypt_cbc(self.iv, data) return encrypt_value.hex() def sm3_hash(self, data): return sm3.sm3_hash(bytes(data, utf-8))4.2 请求参数构造以搜索职位接口为例完整参数构造流程生成13位时间戳构造基础payload字典序列化为JSON字符串并SM4加密生成请求签名def build_search_params(keyword, page1): timestamp str(int(time.time() * 1000)) payload { keyword: keyword, page: page, searchType: 1 } crypto ZhipinCrypto() encrypted crypto.sm4_encrypt(json.dumps(payload), DYNAMIC_KEY) return { payload: encrypted, x-sign: generate_sign(/api/job/search, timestamp), x-timestamp: timestamp }4.3 解密响应数据服务器返回的数据同样经过加密解密流程使用Base64解码响应体SM4解密密钥与请求加密不同解析JSON数据def decrypt_response(encrypted_data): decoded base64.b64decode(encrypted_data) crypto ZhipinCrypto() decrypted crypto.sm4_decrypt(decoded, RESPONSE_KEY) return json.loads(decrypted)5. 反反爬策略与优化5.1 请求特征模拟避免被识别为爬虫的关键点保持合理的请求间隔建议3-5秒随机化User-Agent模拟完整的前端请求流程如先访问首页再搜索5.2 动态密钥处理该网站会定期更换加密密钥处理方案实现密钥自动更新机制捕获密钥过期异常并重新获取将密钥与会话绑定def auto_update_key(): try: response requests.get(KEY_API) return parse_key(response) except Exception as e: logger.error(f密钥更新失败: {e}) return None5.3 浏览器环境模拟对于更严格的反爬可以考虑使用Playwright等工具from playwright.sync_api import sync_playwright with sync_playwright() as p: browser p.chromium.launch() page browser.new_page() page.goto(https://www.zhipin.com) # 执行页面内JS获取加密参数 params page.evaluate(window.getEncryptParams()) browser.close()6. 常见问题排查指南6.1 加密结果不一致问题现象Python实现的加密结果与网页端不一致排查步骤确认密钥和IV值完全一致检查数据编码UTF-8/Base64验证填充模式必须使用PKCS7对比加密前的原始字符串6.2 签名验证失败可能原因时间戳格式错误需要13位毫秒级签名盐值发生变化请求路径包含多余参数解决方案# 正确路径格式示例 path /api/job/search # 不是完整URL6.3 国密算法性能优化SM3/SM4算法在Python中性能较差可以考虑使用C扩展如gmssl的C版本实现请求批处理减少加密次数对静态参数预加密缓存# 缓存加密结果示例 from functools import lru_cache lru_cache(maxsize100) def cached_encrypt(data): return sm4_encrypt(data)7. 进阶技巧与扩展思路7.1 Webpack模块自动化提取对于经常变化的webpack模块可以编写自动提取脚本def extract_webpack_module(page_source, module_id): pattern re.compile(f{module_id}:function\(.*?\){{(.*?)}}) match pattern.search(page_source) if match: return match.group(1) return None7.2 加密逻辑自动化分析使用AST抽象语法树分析加密代码将JS代码转换为AST识别加密函数调用链路自动生成等效Python代码7.3 分布式爬虫架构设计对于大规模数据采集建议采用Redis存储加密密钥和会话状态Celery分布式任务队列多节点IP轮换机制# Celery任务示例 app.task def crawl_job(keyword, page): params build_params(keyword, page) response requests.post(API_URL, dataparams) return parse_response(response)通过这次逆向实战我深刻体会到现代Web应用安全防护的复杂性。一个看似简单的招聘网站背后竟有如此精妙的加密体系。作为开发者我们既要掌握破解技巧更要理解设计原理——这才是逆向工程的真正价值所在。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻