
在分析某个观鸟平台的数据接口时,发现其通信过程经过了多重加密处理。本文将通过一次完整的实战,拆解其请求与响应数据的加密逻辑。
1. 网络抓包分析
首先通过浏览器开发者工具进行抓包,发现核心数据接口为:https://api.birdreport.cn/front/record/activity/search。
该请求存在明显的加密特征:
- 请求头包含三处加密参数:
requestId
sign (疑似MD5)
timestamp (时间戳)

- POST请求的表单数据被整体加密,为一长串密文。

- 服务器返回的响应数据同样被加密,
data字段为一串无法直接识别的字符串。

面对这种“全方位”的加密,常见的思路是寻找其共同的加密入口。在Web前端中,JSON.stringify 常被用于将数据对象转换为字符串以便加密,因此我们可以从这里入手设置断点。
2. 逆向分析加密逻辑
2.1 Hook 关键函数定位加密点
为了拦截并分析数据转换过程,我们向浏览器控制台注入一段 Hook JSON.stringify 的代码。
(function() {
var stringify = JSON.stringify;
JSON.stringify = function(params) {
console.log('Hook JSON.stringify ——> ', params);
debugger;
return stringify(params);
};
})();
注入代码后,在网页上进行翻页操作触发数据请求,代码会自动断住。

在调试器中查看调用堆栈(Call Stack),逐步向上一个栈帧追溯,即可找到网站自身的加密代码逻辑。

2.2 解析请求参数生成逻辑
在加密函数内部,我们可以清晰地看到三个请求头参数的生成方式:
requestId: 由一个名为 getUuid() 的函数生成。

sign: 由 MD5(e + d + c) 计算得出,其中 e, d, c 为特定变量。

timestamp: 由 Date.parse(new Date()) 生成,即当前时间戳。

2.3 解析请求体(表单)加密逻辑
继续分析代码,发现请求体(表单数据)的加密使用了非对称加密。代码中实例化了一个 JSEncrypt 对象,并通过 setPublicKey 方法设置了RSA公钥。随后,使用 encryptUnicodeLong 方法对参数 e(经过处理的请求参数JSON字符串)进行加密,最终赋值给 b.data。

2.4 解析响应数据解密逻辑
请求的加密分析清楚后,接下来需要破解返回数据的解密方式。我们采用同样的思路, Hook JSON.parse 方法。
(function() {
var parse = JSON.parse;
JSON.parse = function(params) {
console.log('Hook JSON.parse ——> ', params);
debugger;
return parse(params);
};
})();
触发断点后,我们成功拦截到了待解析的密文字符串。

顺着调用栈回溯,很快找到了负责解密的函数入口。

进入该函数详细分析,确认其使用了 AES 算法进行解密,并找到了关键的密钥(Key)和初始化向量(IV)。

3. 代码还原与实现
分析清楚所有加密解密流程后,下一步就是将关键的JavaScript代码“扣”下来,并在本地Node.js环境中补全其依赖的辅助函数(如 getUuid, sort_ASCII 等),进行复现。

成功复现后,便能够生成有效的加密请求参数,并解密服务器返回的数据。

最终,我们能够获取到明文的观鸟活动记录数据,其格式如下所示:

总结
本次逆向分析过程展示了一个典型的前后端交互加密场景:请求使用RSA加密敏感参数并附加MD5签名,响应使用A加密保护核心数据。通过系统性地运用抓包、Hook关键函数、调试追踪等技术手段,可以层层剥开加密外壳,理解其设计逻辑。这类分析对于学习前端安全机制、进行合规的安全测试具有重要意义。如果你对更多安全技术实操感兴趣,欢迎在云栈社区交流探讨。