python爬虫HMAC加密案例:某企业信息查询网站

声明:
该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关

一、找出需要加密的参数
  1. js运行 atob(‘aHR0cHM6Ly93d3cucWNjLmNvbS93ZWIvc2VhcmNoP2tleT0lRTQlQjglODclRTglQkUlQkUlRTklOUIlODYlRTUlOUIlQTI=’) 拿到网址,F12打开调试工具,点击分页找到 search/searchMultit 请求,鼠标右击请求找到Copy>Copy as cUrl(cmd)
  2. 打开网站:https://spidertools.cn/#/curl2Request,把拷贝好的curl转成python代码
    在这里插入图片描述
  3. 新建qichacha.py文件,把代码复制到该文件内,把请求中的参数拷贝给data,请求中的data参数换成json,运行文件,发现请求成功并成功获取到数据
    在这里插入图片描述
  4. 然后把代码中header、cookie注释调试后会发现一个虽生成的header、QCCSESSID是加密的
    在这里插入图片描述
  5. 在请求cookies中分析得知 ,QCCSESSID是后端生成的可以不用管
    在这里插入图片描述
二、定位参数加密位置
  1. 由于加密的header是动态生成的,显然使用关键字搜索无法定位到,直接切换到sources,添加XHR拦截 search/searchMulti
    在这里插入图片描述
  2. 一直点击跳到下一个函数,会看到作用域header里面已经没有请求头,在代码里又看到熟悉的参数 x-pid,可以尝试的分析里面的代码
    在这里插入图片描述
  3. 鼠标悬浮到 o.default 找到该函数的位置,会发现里面有个header 赋值的代码,在该代码打上断点
    在这里插入图片描述
  4. 结束此次断点调试,点击分页重新发送请求,鼠标悬浮到 i 上发现有随机生成的 header,并且很容易就找到 i = (0, a.default)(t, e.data),l = (0, r.default)(t, e.data, (0, s.default)()),i 是header的key,l是header的value
    在这里插入图片描述
三、扣出加密代码
  1. 创建qichacha.js文件,用于放扣出的js代码
  2. 先把 header 的 key 和 value 扣出来,i = (0, a.default)(t, e.data),l = (0, r.default)(t, e.data, (0, s.default)()),把 t、e.data 在控制台打印出来会发现 t 是请求路径,e.data是请求参数
    在这里插入图片描述在这里插入图片描述
  3. 扣出加密header的key:i = (0, a.default)(t, e.data)
  • 根据第二步已经知道 t 是请求路径,e.data是请求参数,所以只要扣出 a.default 就行, 把 a.default 打印出来会发现,a.default是方法
    在这里插入图片描述
  • 点击打印出的 a.default 方法,会快速找到该方法的位置,会发现只有 o.default、a.default是值得注意的方法,其他都是js语法,在方法内部打上断点,并把 s 方法扣到qichacha.js,把 a.default 换成 s
    在这里插入图片描述在这里插入图片描述
  • 开始扣出 s 方法中的 o.default:结束本次调试,点击分页重新发送请求,鼠标悬浮到 o.default,点击蓝色部分找到该方法,会再次发现 o.default 方法在该代码打上断点,并把 r 方法 js扣到qichacha.js,并把 s 中 o.default 替换成 r
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • 结束本次断点,点击分页重新发送请求,一直点击跳到断店调试,看到 e 是路径+参数的字符串时,鼠标悬浮到 r 方法中的 o.default,点击蓝色部分找到该方法,会发现是个HMAC加密
    在这里插入图片描述在这里插入图片描述
  • 分析是哪种 HMAC 加密,在控制台分别打印出:加密数据 e、加密密钥 t、解密结果(0,o.default)(e, t).toString(),打开网站 https://www.dute.org/hmac?ref=search,输入密钥 、加密数据,加密算法是 HMAC SHA 512
    在这里插入图片描述在这里插入图片描述
  • 根据 HMAC SHA 512 算法完成 r 方法,经过测试相同的加密数据和加密密钥,解密结果相同,至此 s 方法中的 o.default 完全扣出,至此 s 方法中的 o.defaul 完全扣出
    在这里插入图片描述
  • 开始扣出 s 方法中的 a.default:分析 s 方法中的 a.default,点击蓝色部分找到该方法,会发现是个 r 方法,里面值得注意的是 o.default,其他都是js语法,在 for循环打上断点,,并把 r 方法 js扣到 qichacha.js 因为和之前 r 方法冲突命名为 r1,并把 s 中 a.default 替换成r1
    在这里插入图片描述在这里插入图片描述
  • 结束本次断点,点击分页重新发送请求,一直点击跳到断店调试,看到 r 方法停止调试,在控制台输出 o.default,把打印结果复制出来,补全 r1 方法,至此 s 方法中的 a.default 完全扣出
    在这里插入图片描述
  • 验证结果 i = (0, a.default)(t, e.data),删除除了 e.headers[i] = l 之外的其他断点,点击第一页发送请求,把 i 打印控制台,再运行 qichacha.js 文件打印 i,对比两个 i 会发现两个之一样
    在这里插入图片描述在这里插入图片描述
  1. 扣出加密header的key:l = (0, r.default)(t, e.data, (0, s.default)())
  • 根据第二步已经知道 t 是请求路径,e.data是请求参数,所以只要扣出 r.default 、r.default 就行
  • 点击分页重新发送请求,鼠标悬浮到 s.default,点击蓝色部分找到该方法,会发现 _default 方法,该方法中都是 js 语法,只需把该函数拷贝出来就行,拷贝出来后命名为 s1,把 s.default 换成 s1
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • 测试 s1 方法会发现,报 windows.tid 为 undefined的错误,切换到提示工具 Elements ,全局搜索 windows.tid 会发现该值是固定的值,把该值赋值下来替换 s1 并删除 s1
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • 开始扣出 r.default 方法:鼠标悬浮到 r.defaul,点击蓝色部分找到该方法,会发现一个 s 方法,会发现只有 o.default、a.default是值得注意的方法,其他都是js语法,在方法内部打上断点,并把 s 方法扣到qichacha.js 命名为 s1,把 r.default 换成 s1
    在这里插入图片描述在这里插入图片描述
  • 仔细分析 s1 会发现和之前的 s 方法类似,可以先试着,把 s1 方法中的 o.default、a.default 替换成之前的 r、r1
    在这里插入图片描述
  • 测试 s1 方法:把 n、i、(0,o.default)(n + “pathString” + i + t, (0,a.default)(n)) 输出控制台,把 n、i、tid值传给 s1 并打印出来,发现同样的参数,得到值一样,说明 s1 内部的 o.default、a.default 确实是 r、r1,结束断点调试
    在这里插入图片描述
四、验证结果
  1. 修改qichacha.js,把 t、par作为参数传给 main 方法,并运行文件,打印出生成的 key、value
    在这里插入图片描述
  2. 点击第一页重新请求,在控制台输出 i、l,对比发现值都是一样的
    在这里插入图片描述
  3. 修改 qichacha.py 文件,运行文件,数据获取成功
    在这里插入图片描述
五、最终代码
  1. qichacha.js
var cryptoJs = require('crypto-js')var r = function (e, t) {var hmacSha512 = cryptoJs.HmacSHA512(e, t);return hmacSha512.toString()
};var r1 = function () {var o = {"n": 20,"codes": {"0": "W","1": "l","2": "k","3": "B","4": "Q","5": "g","6": "f","7": "i","8": "i","9": "r","10": "v","11": "6","12": "A","13": "K","14": "N","15": "k","16": "4","17": "L","18": "1","19": "8"}};for (var e = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), t = e + e, n = "", i = 0; i < t.length; ++i) {var a = t[i].charCodeAt() % o.n;n += o.codes[a]}return n
};var s = function () {var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), n = JSON.stringify(e).toLowerCase();return r(t + n, r1(t)).toLowerCase().substr(8, 20)
};var s1 = function () {var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, t = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "", n = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), i = JSON.stringify(e).toLowerCase();return r(n + "pathString" + i + t, r1(n))
};function main(t, par) {var i = s(t, par);var l = s1(t, par, 'f7d239d312096b665fd9e4a46e603592');return {key: i, value: l}
}var t = '/api/search/searchmulti';
var par = {"searchKey": "万达集团","pageIndex": 1,"pageSize": 20,
}
console.log(main(t,par))
  1. qichacha.py
import requests
import execjs
import furlheaders = {"authority": "www.qcc.com","accept": "application/json, text/plain, */*","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","content-type": "application/json","origin": "https://www.qcc.com","pragma": "no-cache","referer": "https://www.qcc.com/web/search?key=^%^E4^%^B8^%^87^%^E8^%^BE^%^BE^%^E9^%^9B^%^86^%^E5^%^9B^%^A2","sec-ch-ua": "^\\^Google","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "^\\^Windows^^","sec-fetch-dest": "empty","sec-fetch-mode": "cors","sec-fetch-site": "same-origin","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36","x-requested-with": "XMLHttpRequest","x-pid": "30ccc65659628b892fb5c1c99a083a95",# "43d930d400d14394164a": "87ae6559513fa06d04d868f1a98d6e48637c09c76415caadecdd28f8e52f9912bca862cce00619ae312b20a57701dcf7858063dd9bb071fad27c01076e24be9d",
}
cookies = {"QCCSESSID": "eaa3818b5a849d53ca70e37dac","qcc_did": "fe88cac5-6065-4d4d-bdc6-f642aea5386b"
}
url = "https://www.qcc.com/api/search/searchMulti"
data = {"searchKey": "万达集团","pageIndex": 2,"pageSize": 20
}with open('qichacha.js','r') as js_file:js = execjs.compile(js_file.read())url_info = furl.furl(url)get_headers = js.call('main',str(url_info.path),data)headers[get_headers['key']] = get_headers['value']print(headers)response = requests.post(url, headers=headers, cookies=cookies, json=data)print(response.text)print(response)

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

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

相关文章

飞桨——总结PPOCRLabel中遇到的坑

操作系统&#xff1a;win10 python环境&#xff1a;python3.9 paddleocr项目版本&#xff1a;2.7 1.报错&#xff1a;ModuleNotFoundError: No module named Polygon&#xff08;已解决&#xff09; 已解决所以没有复现报错内容 尝试方法一&#xff1a;直接使用pip命令安装&…

ts实现合并数组对象中key相同的数据

背景 在平常的业务中&#xff0c;后端同学会返回以下类似的结构数据 // 后端返回的数据结构 [{ id: 1, product_id: 1, pid_name: "Asia", name: "HKG01" },{ id: 2, product_id: 1, pid_name: "Asia", name: "SH01" },{ id: 3, pro…

实现极坐标图表QPolarChart的角度轴范围是[0,360]时,0度在水平右侧

目录 参考角度轴范围是[0,360]时&#xff0c;0度在水平右侧.h.cpp 参考 Qt数据可视化(QPolarChart雷达图) 默认QPolarChart的范围是[0,360]时&#xff0c;0度在垂直上方 如官方例子QValueAxis角度轴范围是[-100,100] 角度轴范围是[0,360]时&#xff0c;0度在水平右侧 原理&am…

简单几步,借助Aapose.Cells将 Excel XLS 转换为PPT

数据呈现是商业和学术工作的一个重要方面。通常&#xff0c;您需要将数据从一种格式转换为另一种格式&#xff0c;以创建信息丰富且具有视觉吸引力的演示文稿。当您需要在幻灯片上呈现工作表数据时&#xff0c;需要从 Excel XLS 转换为 PowerPoint 演示文稿。在这篇博文中&…

原理Redis-QuickList

QuickList **问题1&#xff1a;**ZipList虽然节省内存&#xff0c;但申请内存必须是连续空间&#xff0c;如果内存占用较多&#xff0c;申请内存效率很低。怎么办&#xff1f; 为了缓解这个问题&#xff0c;我们必须限制ZipList的长度和entry大小。 **问题2&#xff1a;**但是…

[网鼎杯 2018]Fakebook

[网鼎杯 2018]Fakebook 打开环境出现一个登录注册的页面 在登录和注册中发现 了地址栏出现变化&#xff0c;扫一波看看 看看robots.txt和flag.php 访问robots.txt看看 再访问user.php.bak <?php class UserInfo { public $name ""; public …

Head、Neck、Backbone介绍

在深度学习中&#xff0c;通常将模型分为三个部分&#xff1a;backbone、neck 和 head。 Backbone&#xff1a;backbone 是模型的主要组成部分&#xff0c;通常是一个卷积神经网络&#xff08;CNN&#xff09;或残差神经网络&#xff08;ResNet&#xff09;等。backbone 负责…

ON1 Photo RAW 2024 for Mac——专业照片编辑的终极利器

ON1 Photo RAW 2024 for Mac是一款专为Mac用户打造的照片编辑器&#xff0c;以其强大的功能和易用的操作&#xff0c;让你的照片编辑工作变得轻松愉快。 一、强大的RAW处理能力 ON1 Photo RAW 2024支持大量的RAW格式照片&#xff0c;能够让你在编辑过程中获得更多的自由度和更…

练习九-利用状态机实现比较复杂的接口设计

练习九-利用状态机实现比较复杂的接口设计 1&#xff0c;任务目的&#xff1a;2&#xff0c;RTL代码3&#xff0c;RTL原理框图4&#xff0c;测试代码5&#xff0c;波形输出 1&#xff0c;任务目的&#xff1a; &#xff08;1&#xff09;学习运用状态机控制的逻辑开关&#xff…

2023.11.22 -数据仓库的概念和发展

目录 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1经典传统数仓架构 2离线大数据数仓架构 3数据仓库三层 数据运营层,源数据层&#xff08;ODS&#xff09;&#xff08;Operational Data Store&#xff09; 数据仓库层&#…

开发上门送桶装水小程序要考虑哪些业务场景

上门送水业务已经有很长一段时间了&#xff0c;但是最开始都是给用户发名片、贴小广告&#xff0c;然后客户电话订水&#xff0c;水站工作人员再上门去送&#xff0c;这种人工记单和派单效率并不高&#xff0c;并且电话沟通中也比较容易出现偏差&#xff0c;那么根据这个情况就…

IT 领域中的主要自动化趋势

48%的IT自动化流程属于IT服务管理&#xff0c;过去一年中&#xff0c;IT运维自动化增长了272%。 IT部门从交付者转变为战略伙伴 今年的《工作自动化指数》数据显示&#xff0c;自动化正在蔓延到组织的各个部门&#xff0c;越来越多的部门采用自动化&#xff0c;并且IT以外的员工…

一条命令彻底卸载Linux自带多个版本jdk

一条命令彻底卸载Linux自带多个版本jdk 检查系统已经安装的jdk rpm -qa | grep java卸载所有已经安装的 jdk xargs 将参数逐个传递 将已安装的 java 程序逐个当做参数传递给 rpm -e --nodeps rpm -qa | grep java | xargs rpm -e --nodeps再次检查系统已经安装的jdk rpm -qa | …

Azure Machine Learning - 搜索中的语义排名

目录 什么是语义排名&#xff1f;语义排名的工作原理如何收集和总结输入语义排名的输出如何对摘要进行评分 语义功能和限制 在 Azure AI 搜索中&#xff0c;“语义排名”通过使用语言理解对搜索结果重新排名来显著提高搜索相关性&#xff0c; 本文概括性地介绍了语义排名工作原…

Arthas 监听 Docker 部署的java项目CPU占比高的信息

1、Linux上安装Arthas wget https://alibaba.github.io/arthas/arthas-boot.jar2、docker ps 查看目标项目的容器ID 3、copy Arthas 到目标容器中 (注意有 &#x1f615; ) docker cp arthas-boot.jar d97e8666666:/4、进入到目标容器目录中 docker exec -it d97e8666666 /b…

5-7求三种数的和

#include<stdio.h> int main(){double sum10;double sum20;double sum30;double sum;int i;for(i1;i<100;i){sum1sum1i;}printf("sum1结果是&#xff1a;%15.6f\n",sum1);for(i1;i<50;i){sum2sum2i*i;}printf("sum2结果是&#xff1a;%15.6f\n"…

Oracle:poor sql导致的latch: cache buffers chains案例

巡检时&#xff0c;执行如下sql发现长会话&#xff1a; SELECT SE.SID,SE.SERIAL#,TO_CHAR(LOGON_TIME,YYYY-MM-DD HH24:MI:SS),SE.STATUS,SE.OSUSER,SE.MACHINE,SE.PROGRAM,SE.BLOCKING_SESSION, SE.SQL_ID,SE.PREV_SQL_ID ,SE.EVENT,SE.P1TEXT,SE.P1,SE.P2TEXT,SE.P2,SE.P3…

visionOS空间计算实战开发教程Day 4 初识ImmersiveSpace

细心的读者会发现在在​​Day1​​​和​​Day2​​​的示例中我们使用的都是​​WindowGroup​​。 main struct visionOSDemoApp: App {var body: some Scene {WindowGroup {ContentView()}} } 本节我们来认识在visionOS开发中会经常用到的另一个概念​​ImmersiveSpace​​…

Spark---集群搭建

Standalone集群搭建与Spark on Yarn配置 1、Standalone Standalone集群是Spark自带的资源调度框架&#xff0c;支持分布式搭建&#xff0c;这里建议搭建Standalone节点数为3台&#xff0c;1台master节点&#xff0c;2台worker节点&#xff0c;这虚拟机中每台节点的内存至少给…

transformer之KV Cache

一、为什么要研究KV Cache 非常有效的加速推理速度&#xff0c;效果如下所示&#xff1a; import numpy as np import time import torch from transformers import AutoModelForCausalLM, AutoTokenizer NAME_OR_PATH r*************** device "cuda" if torch.cu…