1. 项目概述:当爬虫遇上AES加密
做爬虫的朋友,尤其是从入门开始往进阶方向走的,迟早会遇到一个绕不开的坎儿:加密接口。你兴冲冲地打开开发者工具,准备分析网络请求,结果发现关键的请求参数或者返回的数据,是一串你看不懂的“乱码”。这串“乱码”很可能就是AES加密的产物。今天,我就以一个真实的爬虫场景为例,手把手带你走一遍从发现加密、分析加密逻辑,到最终用Python代码成功破解并拿到明文数据的完整流程。这不是一个简单的“调用库解密”的教程,而是聚焦于实战中最关键的一步: 如何从纷繁复杂的网页JavaScript代码中,找到那个关键的密钥(Key)和初始化向量(IV) 。毕竟,给你一个AES解密函数很简单,但告诉你密钥在哪,才是真正的“干货”。
AES(高级加密标准)作为一种对称加密算法,在Web前端数据保护中应用非常广泛。网站用它来加密传输敏感数据,比如登录凭证、交易信息、列表数据等,以防止被轻易窥探。这对安全是好事,但对数据采集工作来说,就多了一道需要破解的屏障。不过别担心,只要加密发生在客户端(即浏览器里),理论上我们就有办法通过逆向工程还原其逻辑。整个过程,更像是一场在代码丛林里的“寻宝游戏”,目标就是找到开启数据宝箱的那把“钥匙”。
2. 逆向分析:在JavaScript的海洋里寻找密钥
面对一个加密接口,直接莽撞地去尝试各种解密算法是不现实的。第一步永远是冷静分析,而浏览器开发者工具(F12)就是我们最强大的武器。我们的目标很明确:找到生成加密参数或解密响应的JavaScript代码,并从中提取出AES加密所用的模式、填充方式、密钥和IV。
2.1 抓包与初步定位
首先,我们通过浏览器正常操作,触发目标数据的加载。在开发者工具的“网络”(Network)面板中,筛选XHR或Fetch请求,找到那个携带加密数据(可能是一个长字符串放在 data 、 encryptData 、 params 等字段里)的请求。同时,观察服务器返回的数据,如果也是加密的,通常会有一个字段(如 isEncrypt: true )或直接就是一段Base64编码的密文。
一个非常实用的技巧是 搜索关键字段 。在开发者工具的“源代码”(Sources)面板,按 Ctrl+Shift+F (Windows)或 Cmd+Opt+F (Mac)开启全局搜索。你可以尝试搜索:
- 加密请求参数的名称,如
"data"、"encryptData"。 - 可能标识加密的字段,如
"isEncrypt"、"encrypted"。 - 加密算法名称,如
"AES"、"CryptoJS"、"encrypt"、"decrypt"。 - 甚至是一些可能的关键词,如
"mode"、"padding"、"iv"。
注意 :现代网站大量使用Webpack等打包工具,源代码可能被压缩、混淆。你搜到的代码可能变量名都是
a、b、c,函数名也被缩短。这时不要慌,我们关注的是 字符串常量 和 核心API调用 ,这些通常不会被混淆。比如搜索"AES"或"CBC"仍然可能直接定位到相关代码块。
2.2 深入分析与逻辑追踪
假设我们通过搜索 "isEncrypt" 定位到了一段疑似解密响应的代码。它可能长这样(已格式化):
function decryptData(encryptedData, keyStr) {
var key = CryptoJS.enc.Utf8.parse(keyStr);
var iv = CryptoJS.enc.Utf8.parse(keyStr); // 注意这里,IV和Key相同
var decrypted = CryptoJS.AES.decrypt(encryptedData, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
这段代码信息量极大:
- 加密库 :使用了
CryptoJS,这是前端最常用的加密库之一。 - 模式与填充 :
CBC模式,Pkcs7填充。这是AES非常常见的组合。 - 密钥与IV :
key和iv都来自keyStr这个参数,且都是通过UTF-8编码转换而来。 这里揭示了一个关键点:IV等于Key 。很多简单的实现为了省事,会直接用密钥作为初始化向量,这其实降低了安全性,但对我们分析来说是好事。 - 输入输出 :
encryptedData是密文,解密后通过toString(CryptoJS.enc.Utf8)转回字符串。
那么,下一个核心问题来了:这个 keyStr 从哪里来?我们需要继续向上追踪。可能它来自某个全局变量,可能是对某个接口返回值的处理(比如时间戳),也可能是写死在代码里的一个固定值。这时,我们需要在代码中搜索 keyStr 或者观察这个解密函数被调用时传入的参数是什么。
2.3 关键密钥的获取
在实战中
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_42539414/article/details/162052647



