当前位置: 首页 > news >正文

js加密逆向

        在现代网页与接口交互中,JavaScript 加密已成为保护数据安全与防止恶意访问的重要手段。无论是接口签名、令牌生成,还是请求参数加密,这些机制的本质是通过前端逻辑与密钥算法来验证请求的合法性。对于数据采集、自动化测试或安全研究人员来说,理解和分析这些加密流程,不是为了规避安全机制,而是为了在获得合法授权的前提下,确保程序端能够正确构造请求,与系统保持一致性。本文将以合规、安全为前提,总结 JS 加密逆向在 Python 爬虫中的常用方法与注意事项,帮助读者在学习技术的同时,时刻牢记法律与道德边界。

一、什么是“JS 加密/签名”

        网站为了防刷或保护接口,会在请求里加上动态参数(如 signtokennoncetimestampx-b3 等),这些值通常由浏览器端 JS 算法计算(可能还带 AES/RSA/HMAC/MD5、Base64、Gzip、Protobuf、WASM、混淆压缩、时间随机数、设备指纹等)。逆向的本质是:找出这些值是在哪儿、怎么被算出来的,然后在你的爬虫里复现。

二、定位:先“找哪里算”,再“看怎么算”

核心工具:Chrome DevTools(Network + Sources)、断点、反混淆、对比法。

步骤

  1. 抓包对比

    • 在 DevTools → Network 里锁定关键接口(响应是你想要的数据)。

    • 右键 “Copy as cURL”,对比不同请求里哪些字段会变(多半是签名/时间戳/nonce/一次性 token)。

    • 观察请求顺序:很多站点会先请求“预签名/密钥/挑战”,再请求业务数据。

  2. 静态检索(Sources 面板)

    • 搜关键词:signtokennoncemd5CryptoJSRSAAESsubtle.digestbtoa/atobtoString(36)hmacsha256fetchXMLHttpRequest

    • 点击 “{}” 按钮 Pretty print 代码,或下载 .js 反混淆(如 jsnice/deobfuscator)。

    • 签名构造链:通常是「拼参与排序 → 加盐/拼接固定串 → 算哈希/加密 → hex/base64 输出」。

  3. 动态断点

    • Network 面板点击请求 → Initiator 查看是谁发的。

    • Sources → 右侧 XHR/fetch 断点(Break on XHR/Fetch),让请求一发出就断住,沿调用栈往上看。

    • 事件断点Breakpoint onScript / 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
http://www.dtcms.com/a/331529.html

相关文章:

  • Chrome插件开发实战:从零开发高效Chrome插件,提升浏览器生产力
  • 通过 USB 配置闭环驱动器——易格斯igus
  • glTF-教程/glb-教程
  • tlias智能学习辅助系统--Maven 高级-私服介绍与资源上传下载
  • AI硬件小众赛道崛起:垂直场景的价值重构与增长密码。
  • Java高级流
  • 公链开发竞争白热化:如何设计下一代高性能、可扩展的区块链基础设施?
  • 云手机的存储功能怎么样?
  • 一次 Unity ↔ Android 基于 RSA‑OAEP 的互通踩坑记
  • Android ADB 常用指令全解析
  • ADB服务端调试
  • markdown格式中table表格不生效,没有编译的原因
  • Mybatis Plus 分页插件报错`GOLDILOCKS`
  • 视频号主页的企业信息如何设置?
  • 深入了解linux系统—— 线程概念
  • Fiddler抓包
  • nginx --ssl证书生成mkcert
  • PCB爆板产生的原因有哪些?如何预防?
  • 第三十一天(系统io)
  • Qwen2-VL-2B 轻量化部署实战:数据集构建、LoRA微调、GPTQ量化与vLLM加速
  • 归并排序专栏
  • 机器学习基础讲解
  • Java -- HashSet的全面说明-Map接口的常用方法-遍历方法
  • feed-forward系列工作集合与跟进(vggt以后)
  • 第二十三天:求逆序对
  • Day54 Java面向对象08 继承
  • 附:日期类Date的实现
  • Pytorch在FSDP模型中使用EMA
  • Leetcode_1780.判断一个数字是否可以表示成三的幂的和
  • UE5 C++ 删除文件