前言在 Python 爬虫开发过程中JavaScript 加密参数是网站反爬机制中最常用、最核心的防护手段之一。主流网站为了防止爬虫恶意抓取数据会对请求头、请求参数、响应数据进行 JS 加密处理单纯的请求发送无法获取有效数据甚至会直接触发网站风控导致 IP 封禁。本文将系统讲解 JS 加密参数的逆向破解核心思路、工具使用、实战代码实现覆盖主流加密算法MD5、SHA、AES、RSA、自定义加密的破解方案结合真实网站案例完成从定位加密代码、分析加密逻辑到 Python 还原加密的全流程操作。本文涉及的核心工具与依赖库官方链接Python 官方下载地址PyCharm 开发工具Chrome 浏览器开发者工具Requests 库PyExecJS 库Node.js 运行环境CryptoJS 官方文档本文适合具备 Python 基础、爬虫基础的开发者学习通过理论 实战的方式让你彻底掌握 JS 加密参数破解的核心技术突破 90% 以上的网站加密防护。一、JS 加密参数反爬机制原理1.1 网站为何使用 JS 加密参数网站服务器在接收客户端请求时会校验请求参数的合法性。如果直接使用明文参数爬虫可以轻易模拟请求而通过前端 JS 对参数进行加密处理后只有携带合法加密参数的请求才会被服务器认可。JS 加密参数的核心作用防止参数被篡改保证数据传输安全性识别非法爬虫请求拦截非浏览器发起的恶意请求增加爬虫开发难度提升反爬防护等级对敏感接口登录、数据查询、支付进行高强度加密防护。1.2 常见 JS 加密参数类型爬虫开发中遇到的 JS 加密主要分为哈希加密、对称加密、非对称加密、自定义加密四大类各类加密的特点、适用场景如下表所示表格加密类型代表算法加密特点网站使用场景破解难度哈希加密MD5、SHA1、SHA256单向加密不可逆固定长度输出登录密码、接口签名、时间戳加密低对称加密AES、DES、3DES加密解密使用同一密钥速度快接口请求参数、响应数据加密中非对称加密RSA公钥加密、私钥解密安全性极高登录密码传输、密钥交换中高自定义加密位运算、字符串拼接、Base64 组合网站自定义逻辑无固定算法轻量级反爬、简易参数加密中1.3 JS 加密参数在请求中的位置加密参数通常出现在 HTTP 请求的三个核心位置爬虫逆向时需优先定位请求 URL 参数如?signxxxxtimestamp123456请求头Headers如token: xxxx、Authorization: xxxx请求体Form Data/JSONPOST 请求中提交的加密表单数据。二、JS 加密参数破解必备工具与环境配置破解 JS 加密参数无需复杂硬件核心依赖浏览器开发者工具、Python 运行环境、JS 代码执行环境本节讲解完整环境配置流程。2.1 核心工具安装与配置2.1.1 Chrome 浏览器开发者工具Chrome 开发者工具是 JS 逆向的核心工具无需额外安装快捷键F12或CtrlShiftI直接打开核心功能Network 面板捕获请求定位加密参数Sources 面板查看、调试、断点 JS 代码Console 面板执行 JS 代码验证加密逻辑。2.1.2 Python 依赖库安装打开命令行执行以下命令安装爬虫与 JS 逆向必备库bash运行# 网络请求库 pip install requests # JS代码执行库Python调用JS pip install PyExecJS # 加密算法库Python原生实现加密 pip install pycryptodome # 数据解析库 pip install lxml2.1.3 Node.js 环境配置PyExecJS 依赖 Node.js 执行 JS 代码安装完成后验证环境bash运行# 查看Node.js版本 node -v # 查看npm版本 npm -v2.2 破解 JS 加密参数的核心流程标准化破解流程是高效逆向的关键完整步骤如下抓包定位通过 Chrome Network 面板捕获请求找到加密参数全局搜索在 JS 代码中搜索加密参数名称定位加密函数断点调试给加密代码打断点分析参数传入、加密逻辑、密钥代码提取提取核心加密 JS 代码去除冗余逻辑代码还原使用 Python 调用 JS 代码或原生实现加密算法请求验证将还原的加密参数带入请求验证是否成功获取数据。三、JS 加密参数定位核心技巧破解加密参数的第一步是精准定位加密代码本节讲解最实用的定位方法适用于所有网站。3.1 Network 面板抓包定位加密参数操作步骤打开 Chrome 开发者工具切换到Network面板勾选Preserve log触发目标请求如点击登录、刷新页面在请求列表中找到目标接口查看Headers/Payload记录加密参数名称如sign、token、encrypt_data。关键判断如果参数为随机字符串、固定长度、无规律字符大概率为 JS 加密生成。3.2 全局搜索定位加密函数定位到加密参数名称后在 Sources 面板使用CtrlShiftF全局搜索参数名找到所有包含该参数的 JS 代码。搜索技巧优先搜索 ** 参数名 ** 格式如sign直接定位赋值代码过滤无关代码重点关注包含CryptoJS、md5、rsa、encrypt等关键词的代码区分压缩 JS 代码一行代码和格式化 JS 代码点击 Chrome 的{}按钮格式化代码。3.3 XHR 断点调试定位加密逻辑对于复杂加密使用 XHR 断点可以精准拦截请求生成过程在 Sources 面板找到XHR/Fetch Breakpoints添加断点规则如接口 URL 关键词重新触发请求代码会在请求发送前暂停查看Call Stack调用栈回溯加密函数的执行流程。3.4 Console 面板验证加密结果定位到加密函数后在 Console 面板直接调用函数输入参数验证输出结果确认加密逻辑是否正确。四、主流 JS 加密算法破解实战本节结合真实案例分别讲解四大类加密算法的逆向分析、代码提取、Python 还原实现所有代码可直接复制运行。4.1 哈希加密MD5/SHA256破解实战哈希加密是最基础的加密方式广泛用于接口签名、参数校验核心特点单向加密、无密钥、固定输出。4.1.1 加密逻辑分析网站常见 MD5 加密代码javascript运行// 网站原生JS加密代码 function getSign(timestamp, data) { // 拼接参数 let str timestamp timestamp data data keyabc123def456; // MD5加密并转为大写 return CryptoJS.MD5(str).toString().toUpperCase(); }加密逻辑拼接固定密钥 动态参数 → MD5 加密 → 转为大写字符串。4.1.2 Python 还原实现方案 1使用 Python 原生 hashlib 库实现推荐效率更高python运行import hashlib def get_sign_python(timestamp: str, data: str) - str: Python原生实现MD5加密 :param timestamp: 时间戳参数 :param data: 业务参数 :return: 加密后的sign签名 # 1. 按照网站逻辑拼接参数 secret_key abc123def456 join_str ftimestamp{timestamp}data{data}key{secret_key} # 2. MD5加密 md5_obj hashlib.md5() md5_obj.update(join_str.encode(utf-8)) # 3. 转为十六进制大写字符串 sign md5_obj.hexdigest().upper() return sign # 测试调用 if __name__ __main__: test_timestamp 1718987654 test_data python_spider result get_sign_python(test_timestamp, test_data) print(f加密生成的sign参数{result})方案 2使用 PyExecJS 调用原生 JS 代码实现python运行import execjs # 提取网站原生JS加密代码 js_code function getSign(timestamp, data) { let str timestamp timestamp data data keyabc123def456; return CryptoJS.MD5(str).toString().toUpperCase(); } def get_sign_js(timestamp: str, data: str) - str: 通过PyExecJS调用JS代码实现加密 # 编译JS代码 ctx execjs.compile(js_code) # 调用JS函数 sign ctx.call(getSign, timestamp, data) return sign # 测试调用 if __name__ __main__: test_timestamp 1718987654 test_data python_spider result get_sign_js(test_timestamp, test_data) print(fJS调用生成的sign参数{result})4.1.3 加密原理总结MD5/SHA 加密属于哈希摘要算法无法解密只能正向生成破解核心找到参数拼接规则和固定密钥Python 实现优先使用原生库性能优于调用 JS 代码。4.2 对称加密AES破解实战AES 是目前最主流的对称加密算法用于请求参数、响应数据的加密解密需要密钥、偏移量、加密模式三个核心参数。4.2.1 加密逻辑分析网站标准 AES-ECB 模式加密代码javascript运行// AES加密核心代码 function aesEncrypt(text, key) { // 密钥处理 let secret_key CryptoJS.enc.Utf8.parse(key); // 加密配置 let encrypted CryptoJS.AES.encrypt( CryptoJS.enc.Utf8.parse(text), // 明文 secret_key, // 密钥 { mode: CryptoJS.mode.ECB, // 加密模式 padding: CryptoJS.pad.Pkcs7 // 填充方式 } ); // 返回Base64格式加密结果 return encrypted.toString(); }加密逻辑明文 → AES 加密ECB 模式 Pkcs7 填充 → Base64 编码输出。4.2.2 Python 还原实现使用 pycryptodome 库实现 AES 加密python运行from Crypto.Cipher import AES from Crypto.Util.Padding import pad import base64 def aes_encrypt_python(text: str, key: str) - str: Python实现AES-ECB加密 :param text: 明文参数 :param key: 加密密钥 :return: Base64格式加密字符串 # 1. 密钥编码必须为16/24/32位 key_bytes key.encode(utf-8) # 2. 初始化AES加密器 cipher AES.new(key_bytes, AES.MODE_ECB) # 3. 明文填充Pkcs7填充 text_bytes pad(text.encode(utf-8), AES.block_size) # 4. 执行加密 encrypt_bytes cipher.encrypt(text_bytes) # 5. Base64编码 result base64.b64encode(encrypt_bytes).decode(utf-8) return result # 测试调用 if __name__ __main__: # 网站固定密钥 aes_key 1234567890123456 # 明文参数 plain_text usernameadminpassword123456 # 加密 encrypt_result aes_encrypt_python(plain_text, aes_key) print(fAES加密结果{encrypt_result})4.2.3 加密原理总结AES 加密核心参数密钥key、模式mode、填充方式padding、偏移量ivECB 模式无偏移量CBC 模式必须搭配偏移量使用破解核心提取网站 JS 中的密钥、偏移量、加密模式。4.3 非对称加密RSA破解实战RSA 加密主要用于敏感数据传输如登录密码使用公钥加密、私钥解密安全性远高于对称加密。4.3.1 加密逻辑分析网站 RSA 加密代码javascript运行// RSA公钥加密 function rsaEncrypt(text, public_key) { let encrypt new JSEncrypt(); // 设置公钥 encrypt.setPublicKey(public_key); // 执行加密 return encrypt.encrypt(text); }加密逻辑明文 → RSA 公钥加密 → 输出加密字符串。4.3.2 Python 还原实现使用 pycryptodome 库实现 RSA 加密python运行from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 import base64 def rsa_encrypt_python(text: str, public_key_str: str) - str: Python实现RSA公钥加密 :param text: 明文密码 :param public_key_str: 网站RSA公钥 :return: 加密字符串 # 1. 格式化公钥 public_key f-----BEGIN PUBLIC KEY-----\n{public_key_str}\n-----END PUBLIC KEY----- # 2. 导入公钥 rsa_key RSA.importKey(public_key) # 3. 初始化加密器 cipher PKCS1_v1_5.new(rsa_key) # 4. 执行加密 encrypt_bytes cipher.encrypt(text.encode(utf-8)) # 5. Base64编码 result base64.b64encode(encrypt_bytes).decode(utf-8) return result # 测试调用 if __name__ __main__: # 网站获取的RSA公钥 rsa_public_key MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC... # 明文密码 password 123456789 # 加密 encrypt_result rsa_encrypt_python(password, rsa_public_key) print(fRSA加密结果{encrypt_result})4.3.3 加密原理总结RSA 加密依赖公钥公钥通常在网页源码或接口中返回加密长度受限长文本会分段加密破解核心获取网站公钥使用标准 RSA 算法还原。4.4 自定义加密破解实战自定义加密是网站根据自身需求编写的简易加密逻辑无固定算法常见形式位运算、字符串反转、Base64 组合、字符替换。4.4.1 加密逻辑分析网站自定义加密代码javascript运行// 自定义加密函数 function customEncrypt(text) { // 1. 字符串反转 let reverse_str text.split().reverse().join(); // 2. Base64编码 let base64_str btoa(reverse_str); // 3. 字符替换替换为! return base64_str.replace(//g, !); }加密逻辑字符串反转 → Base64 编码 → 等号替换为感叹号。4.4.2 Python 还原实现python运行import base64 def custom_encrypt_python(text: str) - str: Python还原网站自定义加密逻辑 # 1. 字符串反转 reverse_str text[::-1] # 2. Base64编码 base64_bytes base64.b64encode(reverse_str.encode(utf-8)) base64_str base64_bytes.decode(utf-8) # 3. 字符替换 result base64_str.replace(, !) return result # 测试调用 if __name__ __main__: test_text python_encrypt_123 result custom_encrypt_python(test_text) print(f自定义加密结果{result})4.4.3 加密原理总结自定义加密无固定算法必须逐行分析 JS 代码逻辑破解核心完全复刻 JS 中的每一步操作优先使用 Python 原生代码实现避免调用 JS。五、Python 爬虫整合加密参数实战请求掌握加密参数还原后将加密逻辑整合到爬虫中模拟合法请求获取数据本节以整合 MD5 签名的爬虫为例。5.1 完整爬虫代码实现python运行import requests import hashlib import time class JsEncryptSpider: def __init__(self): # 请求头 self.headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Referer: https://www.target-website.com/ } # 目标接口URL self.url https://www.target-website.com/api/data # 网站固定密钥 self.secret_key abc123def456 def get_sign(self, timestamp: str, data: str) - str: 生成MD5签名还原网站加密逻辑 join_str ftimestamp{timestamp}data{data}key{self.secret_key} md5_obj hashlib.md5(join_str.encode(utf-8)) return md5_obj.hexdigest().upper() def get_data(self): 发送带加密参数的请求 try: # 1. 生成动态参数 timestamp str(int(time.time())) data spider_data_query # 2. 生成加密签名 sign self.get_sign(timestamp, data) # 3. 构造请求参数 params { timestamp: timestamp, data: data, sign: sign } # 4. 发送请求 response requests.get(self.url, headersself.headers, paramsparams, timeout10) response.raise_for_status() # 5. 解析数据 json_data response.json() if json_data.get(code) 200: print(数据获取成功, json_data.get(data)) return json_data.get(data) else: print(请求失败, json_data.get(msg)) except Exception as e: print(请求异常, str(e)) if __name__ __main__: spider JsEncryptSpider() spider.get_data()5.2 代码核心说明封装加密函数将还原的加密逻辑独立封装方便复用动态参数生成时间戳等动态参数实时生成保证加密参数有效性异常处理添加请求超时、状态码校验提升爬虫稳定性请求头模拟携带完整请求头进一步降低被风控的概率。六、JS 加密参数破解高级技巧与避坑指南6.1 高级破解技巧压缩 JS 代码逆向使用在线 JS 格式化工具处理压缩代码快速定位加密逻辑环境补全对于依赖浏览器环境的 JS 代码补全window、document、navigator等对象多文件加密溯源加密函数分散在多个 JS 文件时通过调用栈溯源核心代码自动化逆向工具使用Js2Py、Obfuscator等工具辅助简化逆向流程。6.2 常见问题与解决方案表格常见问题产生原因解决方案加密参数与网站不一致参数拼接顺序错误、编码格式错误严格复刻 JS 代码统一 UTF-8 编码JS 代码执行报错缺少浏览器环境、依赖库未引入补全环境引入 CryptoJS 等依赖请求返回参数无效加密参数过期、密钥更新动态获取密钥添加时间戳校验加密逻辑过于复杂代码混淆、多层加密分步调试拆解加密函数6.3 合规性说明本文仅用于学习和技术研究严禁用于非法爬虫、数据窃取等违法行为爬虫开发需遵守《网络安全法》《计算机信息系统安全保护条例》爬取数据前需查看网站robots.txt协议获得授权后再进行数据抓取。七、总结与进阶规划7.1 核心知识点总结JS 加密参数是网站核心反爬手段分为哈希、对称、非对称、自定义四大类破解核心流程抓包定位→搜索加密函数→断点调试→代码提取→Python 还原简单加密MD5 / 自定义优先用 Python 原生实现复杂加密可调用 JS 代码爬虫整合加密参数时需保证参数动态生成、请求头模拟、异常处理。