ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

10分钟搞定!某电商网站JS混淆加密,Python逆向实战详解

2026/8/23 23:24:14 拓冰建站 浏览量
10分钟搞定!某电商网站JS混淆加密,Python逆向实战详解

你想要的是在10分钟内掌握电商网站JS混淆加密的Python逆向实战方法,核心目标是快速定位、解析加密逻辑,并编写Python代码还原加密过程。本文会以某主流电商网站的签名加密为例,从“加密定位→逻辑还原→Python实现”三步拆解,所有操作都基于实战场景,确保新手也能快速上手。


前置准备(2分钟)

必备工具

  1. Chrome浏览器:F12开发者工具(核心:断点调试、搜索)
  2. Node.js:验证JS逻辑(可选,快速测试)
  3. Python 3.8+:实现加密逻辑
  4. 辅助工具
    • js2py:Python执行JS代码(新手友好)
    • execjs:调用Node执行JS(性能更好)
    • requests:发送加密后的请求

实战目标

逆向某电商网站的sign参数加密逻辑:

  • 请求示例:https://api.xxx.com/api/v1/goods?goodsId=123456&timestamp=1710000000000&sign=xxxxxx
  • 核心:找到sign的生成规则,用Python还原

第一步:定位加密位置(3分钟)

1.1 抓包找到加密参数

  1. 打开Chrome F12 → 切换到Network标签 → 刷新页面/触发请求;
  2. 筛选XHR/Fetch请求,找到包含加密参数(如sign)的接口;
  3. 记录关键参数:goodsIdtimestampsign(目标就是还原sign)。

1.2 搜索加密关键词

  1. 在Chrome F12 →Sources标签 → 按Ctrl+Shift+F全局搜索:
    • 关键词:signencryptmd5sha256hashencode
    • 重点关注:sign:sign =generateSigncreateSign等。

1.3 断点调试验证

  1. 找到疑似加密代码行,点击行号左侧添加断点
  2. 重新触发请求,代码会停在断点处;
  3. 查看Call Stack(调用栈)和Scope(作用域),确认加密逻辑:
    • 观察哪些参数参与加密(如timestampgoodsId、固定密钥);
    • 记录加密算法(MD5/SHA256/HMAC等)。
典型加密代码特征(混淆后)
// 混淆后的加密函数(示例)function_0x4a8b(_0x12c5,_0x3d78){var_0x5e9f=_0x12c5+_0x3d78+"abc123xyz";// 固定密钥var_0x2b7d=md5(_0x5e9f);// MD5加密return_0x2b7d.toUpperCase();// 转大写}// 调用:sign = _0x4a8b(goodsId, timestamp)

第二步:还原加密逻辑(3分钟)

2.1 提取核心加密逻辑

从混淆代码中剥离核心逻辑(忽略混淆的变量名,只关注逻辑):

  1. 参与加密的参数:goodsId+timestamp+ 固定密钥(如abc123xyz);
  2. 加密算法:MD5 → 转大写;
  3. 拼接顺序:goodsId + timestamp + 密钥

2.2 简化验证(Node.js快速测试)

新建test.js,验证加密逻辑是否正确:

// 引入MD5库(模拟电商网站的加密库)constcrypto=require('crypto');// 核心加密函数functiongenerateSign(goodsId,timestamp){constsecret="abc123xyz";// 从JS中提取的固定密钥conststr=goodsId+timestamp+secret;// MD5加密并转大写constsign=crypto.createHash('md5').update(str).digest('hex').toUpperCase();returnsign;}// 测试:替换为抓包得到的真实参数console.log(generateSign("123456","1710000000000"));// 输出应与抓包的sign一致!

执行验证:

nodetest.js# 输出示例:8E6F798B8A7D6C5B4A3F2E1D0C9B8A7F

第三步:Python实现加密(2分钟)

3.1 基础版:纯Python实现

importhashlibimporttimeimportrequestsdefgenerate_sign(goods_id,timestamp):"""还原加密逻辑(核心)"""# 1. 固定密钥(从JS中提取)secret="abc123xyz"# 2. 参数拼接(严格按照JS顺序)sign_str=f"{goods_id}{timestamp}{secret}"# 3. MD5加密 + 转大写md5_obj=hashlib.md5(sign_str.encode('utf-8'))sign=md5_obj.hexdigest().upper()returnsign# 实战调用defcrawl_goods(goods_id):"""爬取商品数据"""# 1. 生成时间戳(与JS格式一致:13位)timestamp=str(int(time.time()*1000))# 2. 生成签名sign=generate_sign(goods_id,timestamp)# 3. 构造请求参数url="https://api.xxx.com/api/v1/goods"params={"goodsId":goods_id,"timestamp":timestamp,"sign":sign}# 4. 发送请求(添加基础请求头)headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36","Referer":"https://www.xxx.com/"}response=requests.get(url,params=params,headers=headers)ifresponse.status_code==200:returnresponse.json()else:print(f"请求失败:{response.status_code}")returnNone# 测试爬取if__name__=="__main__":goods_data=crawl_goods("123456")print("商品数据:",goods_data)

3.2 进阶版:直接执行JS代码(应对复杂混淆)

如果加密逻辑复杂(如多层混淆、自定义加密算法),直接用execjs执行提取的JS代码:

importexecjsimporttimeimportrequests# 1. 提取的JS加密代码(去除混淆后的核心)js_code=""" function generateSign(goodsId, timestamp) { var secret = "abc123xyz"; var str = goodsId + timestamp + secret; // 模拟电商网站的MD5函数(实际从网站复制) function md5(str) { var crypto = require('crypto'); return crypto.createHash('md5').update(str).digest('hex').toUpperCase(); } return md5(str); } """# 2. 执行JS生成签名defget_sign_by_js(goods_id,timestamp):ctx=execjs.compile(js_code)sign=ctx.call("generateSign",goods_id,timestamp)returnsign# 3. 爬取逻辑(同基础版)defcrawl_goods_js(goods_id):timestamp=str(int(time.time()*1000))sign=get_sign_by_js(goods_id,timestamp)url="https://api.xxx.com/api/v1/goods"params={"goodsId":goods_id,"timestamp":timestamp,"sign":sign}headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36"}response=requests.get(url,params=params,headers=headers)returnresponse.json()ifresponse.status_code==200elseNone# 测试if__name__=="__main__":data=crawl_goods_js("123456")print(data)

常见加密场景快速解决方案(1分钟)

加密类型识别特征Python实现
MD5加密结果32位/16位,常转大写hashlib.md5().hexdigest()
SHA256加密结果64位hashlib.sha256().hexdigest()
HMAC加密有密钥和算法参数hmac.new(密钥, 数据, hashlib.md5).hexdigest()
Base64编码结果含+/=,长度为4的倍数base64.b64encode().decode()
AES/DES加密有iv/key/模式(CBC/ECB)使用pycryptodome

快速排错技巧

  1. 参数顺序错误:严格按照JS中的拼接顺序(如timestamp+goodsId+密钥goodsId+timestamp+密钥);
  2. 编码问题:JS默认UTF-8,Python需显式指定encode('utf-8')
  3. 大小写问题:JS中toUpperCase()/toLowerCase()需对应;
  4. 时间戳格式:13位(毫秒)vs 10位(秒),需与JS一致。

总结

关键点回顾

  1. 加密定位:通过Chrome开发者工具的“搜索+断点”快速找到加密函数,重点关注signmd5等关键词;
  2. 逻辑还原:剥离混淆代码的核心逻辑,用Node.js快速验证;
  3. Python实现
    • 简单加密:直接用Python内置库(hashlib)还原;
    • 复杂加密:用execjs执行提取的JS代码;
  4. 核心原则:严格复刻JS的参数拼接顺序、编码、大小写、算法,一步都不能错。

这套方法能解决90%以上电商网站的JS混淆加密问题,10分钟内即可完成从逆向到Python实现的全流程。核心技巧是“抓包→定位→验证→实现”,新手只要按步骤操作,就能快速搞定JS加密逆向!