一、为什么爬虫开发者需要懂加密?
早期的网站几乎不设防,直接发送 HTTP 请求就能拿到数据。但现在的情况截然不同:
- 90% 以上的 API 接口都有某种形式的请求签名验证
- 参数经过加密或编码处理是家常便饭
- Cookie 和 Token 中包含各种加密信息需要解析
- 反爬手段越来越依赖加密技术(如 WAF 的 challenge-response)
不懂加密的爬虫开发者在面对这些场景时寸步难行。本手册将系统性地讲解爬虫开发中最常遇到的加密知识——不求你成为密码学家,但求你能看懂并复现常见的加密逻辑。
二、密码学基础速成
在深入各种算法之前,先建立几个核心概念:
核心分类
| 类型 | 特点 | 典型算法 | 可逆? |
|---|---|---|---|
| 哈希(Hash) | 单向映射,定长输出 | MD5, SHA 系列 | 不可逆 |
| 对称加密 | 同一密钥加解密 | AES, DES, RC4 | 可逆 |
| 非对称加密 | 公钥加密,私钥解密 | RSA, ECC | 可逆 |
| 编码 | 格式转换,非加密 | Base64, URL编码 | 可逆 |
- 哈希 = 单向指纹(只能算不能还原)
- 对称加密 = 一把钥匙锁门开门(注意保管密钥)
- 编码 = 语言翻译(换了形式但内容一样,不是保密!)
三、哈希算法详解(MD5 / SHA 系列)
3.1 MD5
最经典的哈希算法之一,输出固定为 128 位(32 个十六进制字符)。在爬虫场景中,MD5 最常用于API 签名生成。
3.2 SHA 系列
SHA(Secure Hash Algorithm)家族提供了更安全的替代方案:
- SHA-1:160位输出,已不推荐使用(也有碰撞风险)
- SHA-256:256位输出,目前最常用的安全哈希算法
- SHA-512:512位输出,安全性更高但输出更长
四、对称加密详解(AES / DES / RC4)
当目标网站不只是做签名校验,而是对传输数据进行真正的加密时,你会遇到对称加密。最常见的 AES 算法有几种关键配置需要搞清楚:
AES 三要素
1. 密钥长度(Key Size)
- AES-128:128 位密钥(16 字节)— 平衡安全和性能
- AES-192:192 位密钥(24 字节)— 较少使用
- AES-256:256 位密钥(32 字节)— 最高安全级别
2. 工作模式(Mode)
| 模式 | 说明 | 安全性 | 爬虫中遇到频率 |
|---|---|---|---|
| ECB | 每个块独立加密 | 低 | 偶尔 |
| CBC | 需 IV 向量,链式加密 | 高 | 最常用 |
| CTR | 转为流密码模式 | 高 | 中等 |
| CFB/OFB | 流密码变体 | 较高 | 较少 |
3. 填充方式(Padding)
- Pkcs7(PKCS5/PKCS7):最常用,用缺失字节数填充
- ZeroPadding:用 0 字节填充
- NoPadding:不填充(数据长度必须是块大小的整数倍)
五、编码 vs 加密 — 别再搞混了
这是爬虫新手最容易混淆的概念。编码不是加密!编码不是加密!编码不是加密!(重要的事情说三遍)
三大编码方式对比
| 编码方式 | 作用 | 例子 | 爬虫中的应用 |
|---|---|---|---|
| Base64 | 二进制→ASCII字符 | SGVsbG8gV29ybGQ= (Hello World) | Token 编码、图片传输 |
| URL Encoding | 特殊字符→%XX格式 | %E7%88%AC%E8%99%AB (爬虫) | URL 参数传递 |
| Unicode Escape | 字符→\uXXXX | \u722c\u866b (爬虫) | JS 源码中的中文 |
判断标准:如果一段"乱码"能通过公开的工具一键还原出原始内容,那它就是编码而不是加密。Base64 就是典型的例子——任何人都能解码。
六、API 签名机制全解析
这是爬虫开发者遇到频率最高的加密场景。几乎所有有一定规模的平台的 API 都使用了签名机制来防止请求伪造和重放攻击。
6.1 签名的目的
- 完整性验证:确保请求参数在传输过程中没有被篡改
- 身份认证:证明请求来自合法的调用方(持有正确的密钥)
- 防止重放:加入时间戳等时效性参数使每次签名都不同
6.2 常见签名流程
6.3 三种常见的签名规则
类型一:简单拼接 + MD5
适用于简单接口,规则通常是:
类型二:HMAC-SHA256
HMAC(Hash-based Message Authentication Code)是一种更规范的签名方式,密钥参与哈希过程内部:
类型三:自定义复杂签名
大型平台(淘宝、微信、抖音等)通常使用更复杂的自定义签名算法,可能包括:
- 多轮哈希(MD5 后再做 SHA)
- 加盐(Salt)机制
- 动态密钥(根据时间或其他因素变化)
- 结合 RSA 非对称加密
七、签名逆向实战技巧
当你面对一个未知的签名机制时,以下是一套行之有效的逆向方法:
找到签名生成的 JS 代码位置
在浏览器 DevTools 的 Sources 标签页中,搜索关键词如 "sign"、"signature"、"md5"、"encrypt"、"token"。设置断点后在触发请求时暂停,查看调用栈。
理解签名逻辑
阅读 JS 代码搞清楚:哪些参数参与了签名?排序规则是什么?用了什么算法?密钥在哪里定义的?(硬编码还是从服务端获取的?)
提取中间值逐步验证
不要试图一步到位。把签名过程的每一步中间结果打印出来,用 EasySpider 的加密工具分别验证每一步的计算结果是否正确。
用 Python 复现
确认 JS 侧的逻辑后,用 Python 重写。优先使用标准库(hashlib/hmac)或成熟第三方库(pycryptodome),避免自己实现底层算法。
端到端测试
用 Python 生成的 sign 值构造一个完整请求发送出去,检查返回结果。如果返回"签名错误",回到步骤 3 对比每一环节的中间值。
九、代理 IP 的安全管理
9.1 为什么代理安全很重要?
- 恶意代理风险:免费代理可能是"中间人代理",记录甚至修改你的请求数据
- IP 信誉关联:如果代理 IP 被用于非法活动,可能连累你的真实 IP 受到牵连
- 数据泄露:通过代理发出的请求(含 Cookie、Token)可能被代理服务器记录
9.2 安全使用代理的建议
- 首选付费代理服务商:虽然要花钱,但有 SLA 保证和隐私承诺
- HTTPS 目标站必须用 HTTPS 代理:否则中间人可以看到明文内容
- 不同任务使用不同代理池:避免代理间的关联追踪
- 定期检查代理 IP 质量:使用 EasySpider 的 IP 查询工具验证地理位置和运营商信息
- 敏感操作不用代理:涉及登录、支付等操作时使用直连网络
十、爬虫开发者的自身安全防护
在讨论如何突破别人的安全机制的同时,我们也要注意保护好自己的安全:
- 不得采集涉及国家安全的敏感数据
- 不得大量采集公民个人隐私信息(身份证号、手机号、住址等)
- 不得利用爬虫进行恶意竞争或商业诋毁
- 不得绕过付费墙获取付费内容后传播
- 不得对目标服务器造成过大负载(DoS/DDoS 攻击嫌疑)
- 遵守 robots.txt 协议
- 控制请求频率,避免对目标造成负担
- 仅采集公开发布的数据,尊重版权声明
- 详细记录采集行为日志以备审查
- 如有疑虑,咨询法律专业人士(详见我们的法律法规指南)
十一、工具推荐与实践
在整个爬虫开发和加密调试过程中,以下工具组合可以显著提升效率:
- F12 抓包 → 浏览器 DevTools 分析网络请求
- Curl 转 Python → EasySpider 快速生成基础代码
- JSON 格式化 → 理解响应数据结构
- URL 参数提取 → 分析请求参数构成
- 加密解密工具 → 调试签名/加密逻辑(支持 20+ 种算法)
- 时间戳转换 → 构造时间相关参数
- 文本对比 → 对比前后请求差异定位问题
- IP 查询 → 验证代理 IP 信息
一站式体验地址:pcsoez.com — 完全免费,浏览器本地运行,无需安装。
加密和安全是一个深奥且不断发展的领域。本文涵盖了爬虫开发者最常遇到的 90% 场景。如果你想深入了解某个特定算法的数学原理,我们博客中有更详细的专题文章(如《常见加密算法原理与应用》)。祝你在合法合规的前提下,高效地完成每一个数据采集项目!