案例地址:spiderbuf第C8题
找加密接口和加密参数
加密接口:

加密参数:

响应解密:

定位加密位置
启动器进去打断点然后刷新网页,注意看url是否是我们要的:

然后看fetch里传的啥参数:


第一个是十位时间戳,第二个和第三个需要我们找一下:

ok,稍微分析一下就能知道,salt是在网站的时间变成时间戳然后再转base64,signature是hmacsha256加密网址后再用base64编码形成:


下面开始编写加密代码
加密复现
将此几行全扣下来然后手动还原一下混淆:

封装后如下:
javascript
const CryptoJS = require("crypto-js");
function encryptParams() {
var CryptoJS = require("crypto-js");
const timestamp = Math["floor"](+new Date() / 1000)
, salt = btoa(performance['now']()["toString"]()),
hash = CryptoJS["HmacSHA256"]('' + salt + timestamp, "https://www.spiderbuf.cn/web-scraping-practice/scraper-practice-c08");
let signature = CryptoJS['enc']['Base64']['stringify'](hash)
return {
sig: signature,
s: salt,
t: timestamp,
}
}
请求看看能否拿到数据:

拿到啦,下面解决解密
定位解密位置
打开脚本断点,刷新网页,然后打开hook脚本:

回到上一个栈看看怎么个事儿:

这里太简单了,就是对称加密,稍微分析一下iv和key即可
代码复现
javascript
function decryptData(data, signature) {
const _0x206070 = CryptoJS["enc"]["Base64"]["parse"](data)
_0x46ca84 = CryptoJS['lib']['WordArray']["create"](_0x206070['words'], _0x206070["sigBytes"])
_0x20bc30 = {}
_0x20bc30['ciphertext'] = CryptoJS["lib"]["WordArray"]["create"](_0x46ca84['words']["slice"](4), 1392)
_0x2bd26d = CryptoJS["enc"]["Utf8"]["parse"](signature["slice"](0, 16));
const _0x167729 = CryptoJS["AES"]['decrypt'](_0x20bc30, _0x2bd26d, {
'iv': CryptoJS['lib']['WordArray']["create"](_0x46ca84["words"]["slice"](0, 4), 16),
'mode': CryptoJS['mode']["CBC"],
'padding': CryptoJS['pad']["Pkcs7"]
})
return _0x167729['toString'](CryptoJS['enc']["Utf8"])
}
py调用:
result:

解密成功
小结
本文比之前的练习简单得多,如有问题请及时提出,加油加油