爬虫逆向笔记:Crypto-JS 加密库深度解析

1. 什么是 Crypto-JS?

Crypto-JS 是一款极其流行的 JavaScript 纯算法加密库,在网页前端开发中广泛用于保护敏感数据。对于爬虫工程师而言,掌握它是破解 API 请求参数、Cookie 校验及返回数据解密的核心关键。

2. 核心模块与功能

爬虫逆向场景中,高频接触的功能可分为四类:

① 散列 / 哈希 (Hashes)

  • 特点:不可逆(仅能从明文生成密文,无法反推原文)。
  • 用途:生成数据 “指纹”、请求签名(Sign)。
  • 常见算法:MD5(32 位字符)、SHA-1、SHA-256。

② 对称加密 (Ciphers)

  • 特点:可逆(支持加密 / 解密),加解密使用同一套密钥。
  • 用途:处理完整请求体、解密返回的密文数据。
  • 核心算法:AES(最常用)、DES、TripleDES、RC4。

③ 模式与填充 (Modes and Padding)

对称加密(如 AES)的附属配置,配置不一致会导致解密必报错

  • Mode (模式):
    • CBC:最常用,需搭配 IV(偏移量);
    • ECB:简单模式,无需 IV(安全性较低)。
  • Padding (填充):Pkcs7、ZeroPadding 等(前端常用 Pkcs7)。

④ 编码 (Encoders)

  • 用途:将加密后的二进制结果转换为可读字符串。
  • 常见格式:Base64、Hex(十六进制)、Utf8。

3. 爬虫实战:AES 解密代码模板

逆向 “深证信”“巨潮” 等平台时,标准 AES 解密逻辑如下:

javascript 运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 1. 引入库 (需先执行 npm install crypto-js)
const CryptoJS = require("crypto-js");

/**
* AES 解密函数
* @param {string} cipherText - 网页抓取的密文
* @param {string} keyStr - 密钥 (关键:从 JS 源码中定位)
* @param {string} ivStr - 偏移量 (CBC 模式必需)
*/
function decrypt(cipherText, keyStr, ivStr) {
// 步骤 A: 将密钥/偏移量转为 CryptoJS 识别的 WordArray 对象
let key = CryptoJS.enc.Utf8.parse(keyStr);
let iv = CryptoJS.enc.Utf8.parse(ivStr);

// 步骤 B: 执行解密(模式/填充需与网页代码一致)
let decrypted = CryptoJS.AES.decrypt(cipherText, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});

// 步骤 C: 解密结果转为 UTF-8 字符串
return decrypted.toString(CryptoJS.enc.Utf8);
}

4. 逆向寻找 Key 的技巧

面对混淆的 decode.js 等文件,定位加密参数的核心方法:

① 全局搜索关键字

在 Chrome DevTools (F12) 搜索:AES.encryptAES.decryptCryptoJS,快速定位加密逻辑位置。

② 断点调试 (Breakpoint)

  1. 找到加密函数调用处打断点;
  2. 查看变量:形如 _0x45a2b1 的混淆变量,若值为 16/32 位字符串,大概率是 Key/IV;
  3. 跟踪变量赋值链路,确认最终的密钥原文。

③ 注意编码细节

网页代码常使用 CryptoJS.enc.Utf8.parse("xxx") 处理密钥,本地模拟时不能直接传字符串,必须先转为字数组(与网页逻辑一致)。

5. 环境准备

本地运行 Node.js 脚本前,需安装依赖:

bash 运行

1
2
# 进入项目目录执行
npm install crypto-js