入门:教你用Chrome断点抓包,找到前端加密密钥和算法,并用Python模拟请求与解密

722 阅读4分钟

下面内容帮你一步步理解如何通过Chrome浏览器调试抓包,找到网页前端的加密逻辑和密钥,再用Python代码模拟加密请求和解密响应,适合初学者快速上手。


一、用Chrome浏览器断点调试抓包找加密代码和密钥

  1. 打开开发者工具
    按键盘F12打开Chrome开发者工具,切换到Sources(源码)面板。
  2. 设置XHR断点
    在右侧找到XHR/fetch Breakpoints,点击+号,输入目标接口URL的一部分(如login),当网页发起这个请求时,浏览器会自动暂停,方便你查看相关代码。
  3. 搜索加密关键词
    Sources面板,按Ctrl+Shift+F全局搜索关键词:encryptdecryptkeyAESRSA等,找到可能的加密函数位置。
  4. 设置断点,跟踪调用栈
    在加密函数处设置断点,刷新页面或重新触发请求,断点会停在加密代码,查看调用栈,找到加密密钥和加密函数。
  5. 查看请求参数
    断点停下时,查看请求参数,确认密文和明文的对应关系,验证加密过程。
  6. 提取密钥和算法
    从JS代码中找到密钥(可能是字符串或动态生成),确认加密算法(如AES、RSA、Base64等)。

二、理解并还原加密算法

  1. 看懂加密函数
    理解加密用的算法类型,比如AES的工作模式(ECB、CBC)、密钥长度(16/24/32字节)、填充方式(PKCS#7等)、初始化向量IV等。
  2. 确认编码格式
    确认密钥和密文的编码格式,如UTF-8、Base64或Hex。
  3. 用断点调试观察输入输出
    逐步执行加密函数,确认明文如何变成密文。

三、用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模拟加密请求和解密响应。通过示例代码,你可以快速实践并应用到实际爬虫或接口逆向中。