您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python如何进行菠菜网站请求验证码的data参数加密逻辑分析
## 前言
在网络爬虫和逆向工程领域,菠菜(博彩)网站因其复杂的反爬机制而成为典型的研究对象。其中验证码请求接口的`data`参数加密是常见的技术难点。本文将深入分析如何通过Python逆向这类加密逻辑,涵盖抓包分析、加密定位、算法还原等关键步骤。
---
## 一、环境准备与抓包分析
### 1.1 基础工具准备
- **抓包工具**: Fiddler/Charles/Wireshark
- **浏览器开发者工具**: Chrome DevTools
- **调试工具**: PyCharm/VSCode
- **Python库**: requests, execjs, pyexecjs, hashlib
```python
import requests
from fake_useragent import UserAgent
headers = {
"User-Agent": UserAgent().random,
"Referer": "https://example-bocai.com"
}
通过浏览器开发者工具的Network
面板,筛选XHR
请求,找到验证码请求:
- 典型特征:包含captcha
、token
等关键词
- 观察请求参数结构:
{
"timestamp": 1698765432,
"data": "a1b2c3d4e5...",
"sign": "md5_encrypted_string"
}
在开发者工具的Sources
面板全局搜索:
- encrypt
- JSON.stringify
- data:
在Event Listener Breakpoints
中勾选XHR
事件,拦截请求生成过程。
通过调用栈分析可能存在的加密类型:
加密类型 | 特征 |
---|---|
AES/CBC | 出现CryptoJS.AES.encrypt |
RSA | setPublicKey 字样 |
自定义Base64 | btoa() 或自定义字符替换 |
时间戳哈希 | 参数包含timestamp |
假设发现如下JS代码:
function encryptData(data) {
var key = CryptoJS.enc.Utf8.parse("1234567812345678");
var iv = CryptoJS.enc.Utf8.parse("1234567812345678");
return CryptoJS.AES.encrypt(JSON.stringify(data), key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
}
Python实现:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import json
def aes_encrypt(data):
key = b'1234567812345678'
iv = b'1234567812345678'
cipher = AES.new(key, AES.MODE_CBC, iv)
return cipher.encrypt(pad(json.dumps(data).encode(), AES.block_size)).hex()
当遇到RSA公钥加密时:
import rsa
def rsa_encrypt(message, pub_key):
return rsa.encrypt(message.encode(), pub_key).hex()
菠菜网站通常要求毫秒级时间戳:
import time
timestamp = int(time.time() * 1000)
典型MD5签名示例:
import hashlib
def generate_sign(params, secret):
param_str = '&'.join([f'{k}={v}' for k,v in sorted(params.items())])
return hashlib.md5((param_str + secret).encode()).hexdigest()
def get_captcha():
url = "https://api.example.com/captcha"
params = {
"deviceId": "ABCD-1234",
"timestamp": int(time.time() * 1000)
}
params['sign'] = generate_sign(params, "SECRET_KEY")
response = requests.post(url, json=params, headers=headers)
return response.json()
curl_cffi
库
proxies = {
"http": "http://user:pass@proxy:port",
"https": "http://user:pass@proxy:port"
}
通过本文的步骤,可以系统性地完成:
1. 加密入口定位 → 2. 算法逻辑分析 → 3. Python代码还原
遇到更复杂的混淆时,可能需要结合AST语法树分析或wasm逆向技术。建议持续关注WebAssembly等新兴技术的应用。
技术更新日期:2023年10月
声明:所有代码示例均为教学演示,与实际网站无关 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。