javascript逆向参数加密的本质是用js执行确定性逻辑生成签名等参数,而非真正加密;python可复现纯计算部分(如md5、sha256),但需严格匹配类型转换、编码行为及浏览器api差异,依赖dom时应改用playwright等自动化方案。

JavaScript 逆向参数加密的本质是什么?
它不是“加密”,而是用 JS 执行一段确定性逻辑生成签名、时间戳、token 或其他请求参数。Python 无法直接运行浏览器环境里的 window、document、localStorage,但可以复现其中纯计算部分(比如 md5、hmac、crypto-js.aesEncrypt 对应的 Python 实现)。
- 关键判断:先确认目标 JS 逻辑是否依赖 DOM 或浏览器 API。如果只调用
Math.random()、parseInt()、String.fromCharCode()、Array.sort()等通用函数,基本可 100% 移植 - 常见陷阱:JS 中
+'123'是 number,'123' + 1是 string;Python 的int('123')和'123' + str(1)必须严格对应类型转换顺序 - 不要硬啃混淆代码:优先找入口函数名(如
getSign()、e()、_0xabc123()),再顺藤摸瓜定位核心运算块
如何快速定位并提取关键 JS 计算逻辑?
用 Chrome DevTools 的 Sources 面板打断点,观察变量值变化,比直接读压缩 JS 高效得多。
- 在 Network → 请求 Headers 下点击 Referer 或 X-Requested-With 字段,常能反推签名生成时机
- 在 Debugger 面板里搜索
sign=、token=、timestamp=,找到拼接前的原始变量 - 右键某行 JS → “Break on > Subproperty modification”,对疑似签名对象(如
params)设监听,看哪行赋值了params.sign - 若用了 WebAssembly 或
eval()动态执行,优先尝试console.log打印出实际执行的字符串,再复制到本地解析
Python 复现常见 JS 加密模式要注意什么?
JS 的 toString(16)、charCodeAt()、unescape()、btoa() 在 Python 里都有对应,但行为细节不同。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
unescape('%u4F60') → '你':Python 需用bytes.fromhex('4f60').decode('utf-16be'),不能直接urllib.parse.unquote() -
atob('YWJj')→'abc':Python 用base64.b64decode('YWJj').decode(),注意末尾 padding 缺失时要补== -
new Date().getTime()→ 毫秒时间戳:Python 用int(time.time() * 1000),但 JS 的Date.now()更准,建议同步用int(time.time_ns() / 1_000_000) -
crypto-js.SHA256('a').toString():对应hashlib.sha256(b'a').hexdigest(),但 JS 默认是 hex 输出,Python 要显式调用.hexdigest()
什么时候该放弃复现,改用自动化方案?
当 JS 逻辑包含 canvas.getContext('2d').getImageData()、navigator.hardwareConcurrency、performance.now() 采样、或频繁调用 setTimeout 时,纯 Python 复现成本远高于用无头浏览器。
- 推荐组合:
playwright启动 Chromium,注入 JS 片段,直接调用page.evaluate()获取结果,比PyExecJS更稳定 - 示例:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto('about:blank') sign = page.evaluate("() => { return getSign({a:1,b:2}); }") print(sign) browser.close() - 注意点:每次启动浏览器开销大,务必复用
page实例;若需并发,用browser.new_context()隔离 localStorage/sessionStorage
JS 逆向最耗时间的环节从来不是写 Python,而是确认哪几行才是真正影响参数的逻辑——变量名被混淆、控制流扁平化、字符串数组拼接,这些都会让“看起来像加密”的代码实际只是简单异或或位移。盯住输入和输出,比读懂整段 JS 更有效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










