请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇

news2024/11/11 4:46:10

本篇博客为大家开始着手分析 请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密相关内容
目标站点在本文进行隐藏,如有需要,可直接联系
一般你能搜到这篇博客,代表你采集的站点使用类似加密。

请求头解密目录

    • x-ca-key、x-ca-nonce、x-ca-signature 相关说明
    • 寻找 x-ca-key、x-ca-nonce、x-ca-signature 加密位置
    • 提取关键加密逻辑
      • X-Ca-Key 解析
      • x-ca-nonce 解析
      • x-ca-signature 解析
    • 总结篇

x-ca-key、x-ca-nonce、x-ca-signature 相关说明

x-ca-keyx-ca-noncex-ca-signature 是一组用于进行身份验证和安全保护的 HTTP 请求头。

简易说明如下所示:

  • x-ca-key :是用于标识请求发送者身份的字符串,一般是由服务提供商分配给每个客户端的唯一字符串。
  • x-ca-nonce :是一个随机字符串,用于防止重放攻击。它通常是一个由客户端生成的随机数字或字符串。
  • x-ca-signature :是对请求内容的签名,用于验证请求的完整性和可信性。签名通常是通过使用私钥和一种哈希算法(如 SHA256)对请求内容进行计算得到的。

如果请求头中出现这三个参数,放心,是为了反爬用的,当然也可以用于限制请求频率,防止恶意攻击。

请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇

在解决该反爬问题时,第一步就是要找到他们的加密点。

寻找 x-ca-key、x-ca-nonce、x-ca-signature 加密位置

这一步主要看你对开发者工具的使用熟练程度了,寻找任意一个携带该请求头参数的请求,然后添加相应断点。

通过请求地址中的部分关键字,即可添加 XHR 断点。

请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇
再次刷新页面,可进入断点中,一般会停留在 send() 函数位置。

请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇
下面的步骤就是比较枯燥的了,需要一点点的解密,例如在本函数头部找到 headers,发现其参数 x-ca-key、x-ca-nonce、x-ca-signature 已经被赋值。

请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇
不着急,在调用堆栈中寻找能看懂名称的函数,例如这里的 getList,然后在对应函数中下新断点
请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇
再次刷新页面,又一次进入断点函数,这里需要用到开发者工具的调试工具。
请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇
优先使用 跳过下一函数调用,过程中还需要不断检查参数的最新状态。

反复调试和阅读上下文代码,找到与标题相同的关键字

具体如下:

请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇
这里出现了 x-ca-key、x-ca-nonce、x-ca-signature 三个关键字的赋值,可以初步判断其为重点加密逻辑。

这里继续新增一个断点,以便后续使用。

提取关键加密逻辑

在找到加密位置之后,对其解读就成为了后续重点内容。

X-Ca-Key 解析

在 JS 代码中,看到 e.headers["X-Ca-Key"] = s, 代码段,该值为变量 s 的值,s 等于一段数字,我们需要在前文找到其逻辑来源。

请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇
结果也比较简单,s 是一个固定值:

(s = 203899271), (r = "bK9jk5dBEtjauy6gXL7vZCPJ1fOy076H");

x-ca-nonce 解析

依旧是先看 JS 代码,其赋值位置是一个 p() 函数。

e.headers["X-Ca-Nonce"] = p(),

鼠标移动到 p() 函数上可以得到函数详情连接,点击跳转去提取逻辑。

请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇
找到 p() 函数对应代码如下,这里需要一点点 JS 知识了。

 p = function(e) {
  var t = e || null;
  return null == t && (t = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (function(e) {
      var t = 16 * Math.random() | 0;
      return ("x" === e ? t : 3 & t | 8).toString(16)
  }
  ))),

这是 JavaScript 中生成 UUID (Universally Unique Identifier) 的代码,UUID 是一种用来在应用程序或者网络中标识资源的字符串。

其中,“xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx” 是一个由 36 个字符组成的字符串,是 UUID 的格式。

.replace(/[xy]/g 是一个正则表达式,它替换字符串中的所有 “x” 和 “y” 为随机生成的字符,而后面的函数就是生成随机字符的逻辑,e 是一个随机的 16 进制的数字。

后续我们需要用 Python 改写这段代码。

x-ca-signature 解析

这是本案例中的重点内容了,签名计算,提取相关 JS 代码。

 e.headers["X-Ca-Signature"] = m({
    method: a,
    url: l,
    accept: t,
    params: d,
    date: n,
    contentType: i,
    headers: e.headers,
    appSecret: r
}),

可以看到,其核心使用的是 m() 函数,将其余值作为对象进行了传入,其中 appSecret: r 中的 r,在前文获取 x-ca-key 的时候已经得到。

跳转到 m() 函数内容,取得关键逻辑,后续的难点就是解读下面这段代码。

m = function (e) {
  var t = e.method,
    n = e.url,
    o = e.appSecret,
    i = e.accept,
    s = e.date,
    r = e.contentType,
    a = e.params,
    d = e.headers,
    p = "";
  a || -1 === n.indexOf("?")
    ? a || (a = {})
    : ((a = (function (e) {
        var t = {},
          n = e.match(/[?&]([^=&#]+)=([^&#]*)/g);
        if (n)
          for (var o in n) {
            var i = n[o].split("="),
              s = i[0].substr(1),
              r = i[1];
            t[s] ? (t[s] = [].concat(t[s], r)) : (t[s] = r);
          }
        return t;
      })(n)),
      (n = n.split("?")[0]));
  (p += "".concat(t, "\n")),
    (p += "".concat(i, "\n")),
    (p += "".concat("", "\n")),
    (p += "".concat(r, "\n")),
    (p += "".concat(s, "\n"));
  var m,
    f = u(d),
    h = c(Array.from(Object.keys(f)).sort());
  try {
    for (h.s(); !(m = h.n()).done; ) {
      var v = m.value;
      p += v + ":" + f[v] + "\n";
    }
  } catch (e) {
    h.e(e);
  } finally {
    h.f();
  }
  return (
    (p += (function (e, t) {
      var n,
        o = null,
        i = c(Array.from(Object.keys(t)).sort());
      try {
        for (i.s(); !(n = i.n()).done; ) {
          var s = n.value,
            r = void 0;
          null !== t[s] &&
            void 0 !== t[s] &&
            ((r = "" !== t[s] ? s + "=" + t[s] : s + t[s]),
            (o = o ? o + "&" + r : r));
        }
      } catch (e) {
        i.e(e);
      } finally {
        i.f();
      }
      return o ? e + "?" + o : e;
    })(
      n.replace(
        /^(?=^.{3,255}$)(http(s)?:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.csdn\.net)/,
        ""
      ),
      a
    )),
    l.a.HmacSHA256(p, o).toString(l.a.enc.Base64)
  );
};

总结篇

详细的解释,我们留到下一篇博客继续讲解,不要忘记点赞,收藏,评论

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 850 篇原创博客

全网 6000+人正在学习的 爬虫专栏 👇👇👇👇

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[acwing周赛复盘] 第 88 场周赛20230128

[acwing周赛复盘] 第 88 场周赛20230128 一、本周周赛总结二、 4800. 下一个1. 题目描述2. 思路分析3. 代码实现三、4801. 强连通图1. 题目描述2. 思路分析3. 代码实现四、4802. 金明的假期1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 在T2卡了半天&#…

签到网站js逆向与python实现

登陆分析 数据分析 Chrome浏览器进入填报系统,选择对应学校,来到登陆界面。 打开Chrome开发者工具(快捷键F12),模拟手机端。 111111 222222 333333 点击登陆,分析网络数据包。 表单有四个必需字段: 身份(UserType) 学号(XGH) 姓名(Name) 密码(PassWord) 一个…

2023最新版会声会影有哪些新功能介绍?

会声会影是Corel制作的一款功能强大的视频编辑软件,英文名:Corel VideoStudio。会声会影2023作为当下最为受欢迎的视频编辑处理程序,其在业内可以说享有极高的知名度;而全新的2023版本更是如此,很多忠实的用户都想来体…

如何确保API 的稳定性与正确性?你只需要这一招

一、什么是rest-assured现在,越来越多的 Web 应用转向了RESTful的架构,很多产品和应用暴露给用户的往往就是一组 REST API,这 样有一个好处,用户可以根据需要,调用不同的 API,整合出自己的应用出来。从这个…

Linux常用命令——scp命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) scp 加密的方式在本地主机和远程主机之间复制文件 补充说明 scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且s…

C++基础入门丨7. 指针——一文搞懂指针

操作系统:Windows 10 IDE:Visual Studio 2019 文章目录1 什么是指针2 指针变量的定义和使用3 指针所占用的空间4 空指针和野指针5 const修饰指针6 指针和数组7 指针和函数8 指针、函数、数组1 什么是指针 我们知道每一个变量都有一个内存位置&#xff0…

【ESLint】ESLint的安装配置及vscode插件

一、什么是ESLintESLint是可组装的JavaScript和JSX检查工具。工作中常用,所以最好有所了解。可以在官网中查询相关规则:ESLint - Pluggable JavaScript linter - ESLint中文二、ESLint的安装配置在创建自定义vue项目时,要勾选CSS Pre-process…

SpringCloud 微服务工具集

SpringCloud 微服务工具集 v1.1 微服务架构集大成者,云计算最佳业务实践。 版本: Hoxton SR6 1.什么是微服务 官网: https://www.martinfowler.com/articles/microservices.html In short, the microservice architectural (架构)style is…

32种EMC标准电路分享-电路接口防护-标准参考电路

30种EMC标准电路01 AC24V接口EMC设计标准电路02 AC110V-220VEMC设计标准电路03 AC380V接口EMC设计标准电路04 AV接口EMC设计标准电路05 CAN接口EMC设计标准电路06 DC12V接口EMC设计标准电路07 DC24V接口EMC设计标准电路08 DC48接口EMC设计标准电路09 DC110V接口EMC设计标准电路…

Blender 物理属性 (四)流体

文章目录流体简介.域.创建域.直接创建.通过物体创建.域的属性.设置.液体(域类型为液体时).扩散.网格.气体(域类型为气体时).消融.噪波.视图显示.缓存.流.创建水.创建火与烟.流来源.初始速度.渲染火与烟.效果器.流体简介. 1 流体用…

这些好用的办公软件分享给你

软件一:备忘录 现在大部分手机备忘录都提供语音记录功能,可以实时录音并转换成文本内容记录下来,使用起来还是比较方便的,但是要注意它支持转换的时长是有限制的哦! 操作步骤:打开手机备忘录,…

【宝塔】【Windows】【Blessing-Skin】【我的世界】用宝塔Windows搭建皮肤站

文章目录前言所需环境相关链接安装宝塔安装步骤访问宝塔同意协议安装环境安装WNMP添加站点开始安装皮肤站配置网站配置Nginx URL重写规则(即 伪静态)配置PHP安装皮肤站一些小调整安装插件常见问题 - 插件市场严重错误添加认证服务器结尾前言 为什么不用…

数影周报:LOL源代码遭黑客拍卖,阿里杭州西溪全球总部2023年底前全面建成

本周看点:《英雄联盟》游戏源代码遭黑客拍卖;消息称Salesforce 将任命三位新独立董事;2022年下架移动应用程序420款;抖音超市上线;戴尔以约1亿美元收购以色列初创公司Cloudify......数据安全那些事《英雄联盟》游戏源代…

【Pytorch项目实战】之自然语言处理:RNN、LSTM、GRU、Transformer

文章目录自然语言处理算法一:循环神经网络(Recurrent Natural Network,RNN)算法二:长短时记忆神经网络(Long Short-Term Memory,LSTM)算法三:门控循环单元神经网络&#…

基于android的新闻阅读系统

需求信息: 从模块的角度将APP的主要内容划分为登录模块、新闻模块、留言模块、报道模块、关注模块、语音模块这六个功能模块,完成以下功能: (1)登录模块 当用户打开应用程序后,如果直接登录,由于…

ElasticSearch - DSL查询语法

目录 DSL查询分类 全文检索查询 精确查询 地理查询 复合查询 相关性算分 算分函数查询 BooleanQuery DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询常见的查询类型包括: 查询所有:查询出所有的数据&#x…

Rust库交叉编译以及在Android与iOS中使用

本篇是关于交叉编译Rust库,生成Android和iOS的二进制文件(so与a文件),以及简单的集成使用。 1.环境 系统:macOS 13.0 M1 Pro,Windows 10 Python: 3.9.6 Rust: 1.66.1 NDK: 21.4.7075529 这里就不具体说…

收藏贴!新手到底应该购买Salesforce专业版还是企业版?

Salesforce专业版(Professional Edition)是一个适用于小型企业的工具,它具有完整Salesforce套件的许多功能,但也有一些明显的限制。本篇文章将具体阐明Salesforce专业版是什么,它的优势以及其与企业版(Ente…

SQL Server 2008如何创建定期自动备份任务

我们知道,利用SQL Server 2008数据库可以实现数据库的定期自动备份。方法是用SQL SERVER 2008自带的维护计划创建一个计划对数据库进行备份,下面我们将SQL SERVER 2008定期自动备份的方法分享给大家。 首先需要启动SQL Server Agent服务,这个…

Python实现vlog生成器

Python实现vlog生成器 vlog,全称为Video blog,意为影音博客,也有翻译为微录。 本文将尝试用Python基于Moviepy从一个文本文件中自动生成一个视频格式的vlog,实现的功能如下: 将文件的第一行标题生成视频的片头将文件…