下面内容帮你一步步理解如何通过Chrome浏览器调试抓包,找到网页前端的加密逻辑和密钥,再用Python代码模拟加密请求和解密响应,适合初学者快速上手。
一、用Chrome浏览器断点调试抓包找加密代码和密钥
- 打开开发者工具
按键盘F12打开Chrome开发者工具,切换到Sources(源码)面板。 - 设置XHR断点
在右侧找到XHR/fetch Breakpoints,点击+号,输入目标接口URL的一部分(如login),当网页发起这个请求时,浏览器会自动暂停,方便你查看相关代码。 - 搜索加密关键词
在Sources面板,按Ctrl+Shift+F全局搜索关键词:encrypt、decrypt、key、AES、RSA等,找到可能的加密函数位置。 - 设置断点,跟踪调用栈
在加密函数处设置断点,刷新页面或重新触发请求,断点会停在加密代码,查看调用栈,找到加密密钥和加密函数。 - 查看请求参数
断点停下时,查看请求参数,确认密文和明文的对应关系,验证加密过程。 - 提取密钥和算法
从JS代码中找到密钥(可能是字符串或动态生成),确认加密算法(如AES、RSA、Base64等)。
二、理解并还原加密算法
- 看懂加密函数
理解加密用的算法类型,比如AES的工作模式(ECB、CBC)、密钥长度(16/24/32字节)、填充方式(PKCS#7等)、初始化向量IV等。 - 确认编码格式
确认密钥和密文的编码格式,如UTF-8、Base64或Hex。 - 用断点调试观察输入输出
逐步执行加密函数,确认明文如何变成密文。
三、用Python模拟请求并实现加密和解密
1. 安装必备库
pip install requests pycryptodome execjs
2. 如果加密逻辑复杂,直接用Python调用JS代码
- 将提取的JS加密函数保存为
encrypt.js,用execjs执行。
示例代码:
import execjs
with open('encrypt.js', 'r', encoding='utf-8') as f:
js_code = f.read()
ctx = execjs.compile(js_code)
encrypted_param = ctx.call('encrypt', '明文密码')
print("加密后参数:", encrypted_param)
3. 用requests发送加密后的请求
import requests
url = 'https://example.com/api/login'
data = {
'username': 'your_username',
'password': encrypted_param # 加密后的密码
}
response = requests.post(url, data=data)
print("响应内容:", response.text)
4. 如果响应数据也加密,Python实现解密
以AES解密为例:
from Crypto.Cipher import AES
import base64
def aes_decrypt(encrypted_text, key):
key_bytes = key.encode('utf-8')
cipher = AES.new(key_bytes, AES.MODE_ECB) # 根据实际模式调整
encrypted_bytes = base64.b64decode(encrypted_text)
decrypted = cipher.decrypt(encrypted_bytes)
# 去除填充(这里用简单的0填充示例,实际根据填充方式调整)
return decrypted.rstrip(b'\x00').decode('utf-8')
# 假设响应中加密字段是data
encrypted_response = '响应中加密的Base64字符串'
key = '16字节长度的密钥字符串'
print("解密后数据:", aes_decrypt(encrypted_response, key))
四、完整流程总结
- 打开Chrome开发者工具,设置XHR断点,触发请求,断点停在请求发起处。
- 找到加密函数和密钥,确认加密算法。
- 提取JS加密代码,保存并用
execjs调用,生成加密参数。 - 用Python的
requests库模拟HTTP请求,发送加密参数。 - 如果响应加密,分析解密逻辑,用
pycryptodome实现解密,获得明文数据。
五、实用示例代码合集
AES CBC模式加密与解密示例
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64
# 生成16字节密钥和IV
key = get_random_bytes(16)
iv = get_random_bytes(16)
# 明文
plain_text = "Hello, AES Encryption!".encode('utf-8')
# 填充明文
padded_data = pad(plain_text, AES.block_size)
# 加密
cipher = AES.new(key, AES.MODE_CBC, iv)
encrypted_data = cipher.encrypt(padded_data)
# 拼接IV和密文,Base64编码
cipher_text_str = base64.b64encode(iv + encrypted_data).decode('utf-8')
print("加密后:", cipher_text_str)
# 解密
encrypted_bytes = base64.b64decode(cipher_text_str)
iv_dec = encrypted_bytes[:16]
ciphertext_dec = encrypted_bytes[16:]
decipher = AES.new(key, AES.MODE_CBC, iv_dec)
decrypted_padded = decipher.decrypt(ciphertext_dec)
decrypted = unpad(decrypted_padded, AES.block_size)
print("解密后:", decrypted.decode('utf-8'))
用execjs调用JS加密函数示例
假设JS代码encrypt.js:
function encrypt(text) {
// 简单示例:把字符串反转作为“加密”
return text.split('').reverse().join('');
}
Python调用:
import execjs
with open('encrypt.js', 'r', encoding='utf-8') as f:
js_code = f.read()
ctx = execjs.compile(js_code)
encrypted = ctx.call('encrypt', 'password123')
print("加密结果:", encrypted) # 输出: 321drowssap
以上内容帮助你用最简单的方式理解如何利用Chrome断点调试找到前端加密密钥和算法,并用Python模拟加密请求和解密响应。通过示例代码,你可以快速实践并应用到实际爬虫或接口逆向中。