js加密逆向
在现代网页与接口交互中,JavaScript 加密已成为保护数据安全与防止恶意访问的重要手段。无论是接口签名、令牌生成,还是请求参数加密,这些机制的本质是通过前端逻辑与密钥算法来验证请求的合法性。对于数据采集、自动化测试或安全研究人员来说,理解和分析这些加密流程,不是为了规避安全机制,而是为了在获得合法授权的前提下,确保程序端能够正确构造请求,与系统保持一致性。本文将以合规、安全为前提,总结 JS 加密逆向在 Python 爬虫中的常用方法与注意事项,帮助读者在学习技术的同时,时刻牢记法律与道德边界。
一、什么是“JS 加密/签名”
网站为了防刷或保护接口,会在请求里加上动态参数(如 sign
、token
、nonce
、timestamp
、x-b3
等),这些值通常由浏览器端 JS 算法计算(可能还带 AES/RSA/HMAC/MD5、Base64、Gzip、Protobuf、WASM、混淆压缩、时间随机数、设备指纹等)。逆向的本质是:找出这些值是在哪儿、怎么被算出来的,然后在你的爬虫里复现。
二、定位:先“找哪里算”,再“看怎么算”
核心工具:Chrome DevTools(Network + Sources)、断点、反混淆、对比法。
步骤
-
抓包对比
-
在 DevTools → Network 里锁定关键接口(响应是你想要的数据)。
-
右键 “Copy as cURL”,对比不同请求里哪些字段会变(多半是签名/时间戳/nonce/一次性 token)。
-
观察请求顺序:很多站点会先请求“预签名/密钥/挑战”,再请求业务数据。
-
-
静态检索(Sources 面板)
-
搜关键词:
sign
、token
、nonce
、md5
、CryptoJS
、RSA
、AES
、subtle.digest
、btoa/atob
、toString(36)
、hmac
、sha256
、fetch
、XMLHttpRequest
。 -
点击 “{}” 按钮 Pretty print 代码,或下载 .js 反混淆(如
jsnice
/deobfuscator
)。 -
看签名构造链:通常是「拼参与排序 → 加盐/拼接固定串 → 算哈希/加密 → hex/base64 输出」。
-
-
动态断点
-
Network 面板点击请求 → Initiator 查看是谁发的。
-
Sources → 右侧 XHR/fetch 断点(Break on XHR/Fetch),让请求一发出就断住,沿调用栈往上看。
-
事件断点:
Breakpoint on
→Script
/setTimeout
等,卡住混淆时序。 -
在关键函数上插入
debugger;
(临时修改)/ 或右键添加断点。
-
三、动态 Hook(最省时间)
当代码混淆严重时,用注入 Hook直接把输入/输出打印出来,比硬啃混淆快很多。
Playwright 注入全局 Hook(推荐):
# pip install playwright && playwright install
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)ctx = browser.new_context()page = ctx.new_page()page.add_init_script("""// 1) Hook fetch / XHR,打印请求与 body(function(){const _fetch = window.fetch;window.fetch = function(input, init){try { console.log('[HOOK][fetch]', input, init && init.body); } catch(e){}return _fetch.apply(this, arguments);};const _open = X