当前位置: 首页 > news >正文

一次封装,解放双手:Requests如何实现0入侵请求与响应的智能加解密

引言

之前写了 Requests 自动重试的文章,突然想到,之前还用到过 Requests 自动加解密请求的逻辑,分享一下。之前在做逆向的时候,发现一般医院的小程序请求会这么玩,请求数据可能加密也可能不加密,但是返回的 json 数据是加密的,每次都要去写加解密的代码就比较麻烦,所以想了一个办法将加解密封装到 Requests 里面,下面开始。

session

session 是 Requests 中比较重要的一个类,基本上所有的请求都走 session 类的 send 方法,所以咱们这里从 send 方法入手。

服务端代码

这里为了方便演示,我开发了一个小小的 demo 服务端来演示服务端加密的场景。先看一下代码:

import base64
import json
import uuid
from hashlib import md5from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from flask import Flask, request, Responseapp = Flask(__name__)def get_nonce():return uuid.uuid4().__str__()def encrypt(k, data, mode=AES.MODE_ECB):aes = AES.new(k.encode(), mode)result = aes.encrypt(pad(data.encode(), block_size=16))return base64.b64encode(result).decode()def get_headers():return {'Content-Type': 'application/json','x-encrypt': 'true','nonce': get_nonce()}@app.post('/')
def index():data = request.jsonprint(f"get timestamp is :{request.headers.get('x-timestamp')}")print(f"get sign is :{request.headers.get('x-sign')}")print(f'json data is:{data}')assert md5(request.headers.get('x-timestamp').encode()).hexdigest() == request.headers.get('x-sign')headers = get_headers()data = {'encrypt': str(data['data'] * 2) + (request.headers.get('x-sign') or '')}print(f'before encrypt data is:{data}')d = encrypt(headers.get('nonce').replace('-', '')[:16], json.dumps(data))print(f'after encrypt data is:{d}')return Response(json.dumps({'data': d}), headers=headers, mimetype='application/json')if __name__ == '__main__':app.run(debug=True)

这里通过 flask 写了一个接口,代码不复杂,大家应该都能看懂。简单讲下逻辑:

  • 首先这是个一个 post 请求的接口,接受 json 数据和请求头
  • 接收到请求头后获取时间戳和 sign 字段
  • 使用时间戳验证 sign 字段是否正确,不正确抛出异常,为了演示这里就不处理异常的场景了
  • 接下来处理数据,将接收到的数据取出 data 字段,复制一遍,然后添加 sign 字段后作为初始数据
  • 然后将初始数据进行加密
  • 返回加密后的数据,并且在返回的响应头中添加 nonce 字段作为解密的密钥,并且将 x-encrypt 响应头设置为 true

客户端代码

import base64
import time
from hashlib import md5import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpaddef decrypt(k, data, mode=AES.MODE_ECB):aes = AES.new(k.encode(), mode)result = aes.decrypt(base64.b64decode(data))return unpad(result, block_size=16).decode()class CustomSession(requests.Session):def send(self, request, **kwargs):tt = int(time.time() * 1000)request.headers['x-timestamp'] = f'{tt}'request.headers['x-sign'] = f'{md5(str(tt).encode()).hexdigest()}'print(f'request.headers: {request.headers}')print(f'request.body: {request.body.decode()}')response = super().send(request, **kwargs)print(f'response.headers: {response.headers}')print(f'response.body: {response.text}')if response.headers.get('x-encrypt') == 'true':k = response.headers.get('nonce').replace('-', '')[:16]enc = response.json().get('data')print(f'encrypt data: {enc}')r = decrypt(k, enc, AES.MODE_ECB)print(f'decrypt data: {r}')setattr(response, '_content', r.encode())return responsereturn responseif __name__ == '__main__':session = CustomSession()res = session.post(url='http://127.0.0.1:5000/', json={'data': 'test123'})print(f'response is:{res.json()}')

在客户端代码,我们继承了 session 类,并且重写了 send 方法,加入了自定义的逻辑,自定义的这块逻辑就是本篇文章的核心代码了,自定义的逻辑中总共做了几件事:

  • 首先获取了当前的时间戳,将时间戳添加到 x-timestamp 请求头中
  • 对时间戳字段取 md5 作为 sign 字段添加到 x-sign 请求头中
  • 执行正常的 send 方法逻辑
  • 判断是否存在 x-encrypt 字段并且字段的内容是否等于 true
  • 获取响应头中的 nonce 字段,并且去掉 - 后取前十六个字节作为密钥
  • 获取加密后的数据,使用上面获取到的密钥进行解密
  • 将解密后的 json 重新赋值给响应对象,返回响应

以上就是客户端和服务端的代码和执行逻辑。

当然了,这篇文章想要说的是自动加解密的逻辑,这里为了演示方便只用到了响应加密,并没有添加请求加密的逻辑,有需求的小伙伴可以自行动手添加。主要是的思路就是重写 send 方法,在 send 方法的前后,添加自定义的请求加密和响应解密的逻辑。

先看下运行结果:

服务端日志:

127.0.0.1 - - [22/Nov/2024 21:11:23] "POST / HTTP/1.1" 200 -
get timestamp is :1732281083065
get sign is :a981a12b2bdd5bd795c5323c516e2407
json data is:{'data': 'test123'}
before encrypt data is:{'encrypt': 'test123test123a981a12b2bdd5bd795c5323c516e2407'}
after encrypt data is:5qzFCwzBoTi4eA3NLW7Z8ZA/4jh5QLBRwwn8uPCYncZowxrRhqjrmQnfnC2keyN6q8Z0CrqrNej5s69A075XkA==

客户端日志:

request.headers: {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '19', 'Content-Type': 'application/json', 'x-timestamp': '1732281083065', 'x-sign': 'a981a12b2bdd5bd795c5323c516e2407'}
request.body: {"data": "test123"}
response.headers: {'Server': 'Werkzeug/3.1.3 Python/3.10.9', 'Date': 'Fri, 22 Nov 2024 13:11:23 GMT', 'Content-Type': 'application/json', 'x-encrypt': 'true', 'nonce': '3d783f6f-b0d3-43dd-8f96-14db015b8f68', 'Content-Length': '100', 'Connection': 'close'}
response.body: {"data": "5qzFCwzBoTi4eA3NLW7Z8ZA/4jh5QLBRwwn8uPCYncZowxrRhqjrmQnfnC2keyN6q8Z0CrqrNej5s69A075XkA=="}
encrypt data: 5qzFCwzBoTi4eA3NLW7Z8ZA/4jh5QLBRwwn8uPCYncZowxrRhqjrmQnfnC2keyN6q8Z0CrqrNej5s69A075XkA==
decrypt data: {"encrypt": "test123test123a981a12b2bdd5bd795c5323c516e2407"}
response is:{'encrypt': 'test123test123a981a12b2bdd5bd795c5323c516e2407'}

从客户端日志中,可以看到,请求的 body 是明文的值,请求头中包含一个时间戳字段和 sign 字段用来给服务端做校验,被发送出去后接收到的是加密后的数据,并且响应头中多了一个 nonce 字段,作为密钥用来解密响应数据,将响应数据解密后可以得到两个我们需要的响应。

从服务端日志中,可以看到,显示获取了时间戳字段和 sign 字段,并且经过处理后,将数据加密返回给客户端。

抓包验证

接下来抓包验证一下,是否如上文所说的响应是加密的,请求是明文的

响应

在这里插入图片描述

请求

image-20241122212951719

从截图中可以看到,在发送请求时,请求是明文的,在接收到响应时,响应是加密的,这里其实可以拓宽一下,如果我们将请求加密,那么整个请求和响应就都是加密的了,但是因为重写了 sessionsend 方法,其实并不会对整体的业务代码有很大的入侵,可以更加方便的更改或者判断是否需要加解密,应该如何加密和解密。这里提供了极大的灵活性,并且可以做到对业务 0 入侵。

总结

以上就是自动加解密的所有逻辑了,希望对大家有所帮助。

相关文章:

一次封装,解放双手:Requests如何实现0入侵请求与响应的智能加解密

引言 之前写了 Requests 自动重试的文章,突然想到,之前还用到过 Requests 自动加解密请求的逻辑,分享一下。之前在做逆向的时候,发现一般医院的小程序请求会这么玩,请求数据可能加密也可能不加密,但是返回…...

Notepad++--在开头快速添加行号

原文网址:Notepad--在开头快速添加行号_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Notepad怎样在开头快速添加行号。 需求 原文件 想要的效果 方法 1.添加点号 Alt鼠标左键,从首行选中首列下拉,选中需要添加序号的所有行的首列&#xff…...

Python和MATLAB示例临床因素分析

🌵Python片段 为了演示临床因素的分析,让我们模拟一个数据集并执行一些基本的统计和机器学习分析。我们将重点关注以下步骤: 模拟数据集:创建具有年龄、性别、BMI、吸烟状况和疾病结果等特征的临床数据。描述性统计:…...

嵌入式硬件实战基础篇(二)-稳定输出3.3V的太阳能电池-无限充放电

引言:本内容主要用作于学习巩固嵌入式硬件内容知识,用于想提升下述能力,针对学习稳压芯片和电容以及电池之间的运用,对于硬件PCB以及原理图的练习和前面硬件篇的实际运用;太阳能是一种清洁、可再生的能源,广…...

【数据结构】树——链式存储二叉树的基础

写在前面 书接上文:【数据结构】树——顺序存储二叉树 本篇笔记主要讲解链式存储二叉树的主要思想、如何访问每个结点、结点之间的关联、如何递归查找每个结点,为后续更高级的树形结构打下基础。不了解树的小伙伴可以查看上文 文章目录 写在前面 一、链…...

STM32-- keil常见报错与解决办法

调试问题 1. keil在线调试需要点击好几次运行才可以运行,要是直接下载程序直接就不运行。 解决:target里面的use microlib要勾选,因为使用了printf。 keil在线调试STM32,点三次运行才能跑到main的问题解决。 keil在线调试STM32…...

【大数据学习 | Spark-Core】RDD的概念与Spark任务的执行流程

1. RDD的设计背景 在实际应用中,存在许多迭代式计算,这些应用场景的共同之处是,不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。但是,目前的MapReduce框架都是把中间结果写入到HDFS中&…...

一文读懂埋阻埋容工艺

PCB 埋阻埋容工艺是一种在 PCB 板内部埋入电阻和电容的工艺。通常情况下, PCB 上电阻和电容都是通过贴片技术直接焊接在板面上的,而埋阻埋容工艺则将电 阻和电容嵌入到 PCB 板的内部层中,这种印制电路板,其自下而上依次包括第一介电 层,隐埋电…...

mysql 数据表导出为 markdown(附 go 语言 gorm 的实际使用)

前言 通常业务系统开发中,数据库的设计与维护是至关重要的环节。而数据库的文档化则是确保团队成员之间有效沟通、快速理解系统架构的基础。 但目前数据文档都是手动写的,耗时费力,由于当前项目使用的是 mysql 作为存储引擎,找找…...

本地云存储 MinIO 中修改用户密码

本地云存储 MinIO 中修改用户密码 MinIO 中修改用户密码前提条件步骤 1:安装 MinIO Client对于 Linux/macOS:对于 Windows: 步骤 2:配置 MinIO Client步骤 3:查看现有用户步骤 4:修改用户密码步骤 5&#x…...

go项目中比较好的实践方案

工作两年来,我并未遇到太大的挑战,也没有特别值得夸耀的项目。尽管如此,在日常的杂项工作中,我积累了不少心得,许多实践方法也在思考中逐渐得到优化。因此,我在这里记录下这些心得。 转发与封装 这个需求…...

回溯法基础入门解析

回溯法 前 言 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。回溯法,一般可以解决如下几种问题: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一…...

计算机网络-VPN虚拟专用网络概述

前面我们学习了在企业内部的二层交换机网络、三层路由网络包括静态路由、OSPF、IS-IS、NAT等,现在开始学习下VPN(Virtual Private Network,虚拟专用网络),其实VPN可能很多人听到第一反应就是梯子,但是其实这…...

信创时代的数据库之路:2024 Top10 国产数据库迁移与同步指南

数据库一直是企业数字化和创新的重要基础设施之一。从传统的关系型数据库到非关系型数据库、分析型数据库,再到云数据库和多模数据库,这一领域仍在持续变革中,各种新型数据库产品涌现,数据管理的能力和应用场景也由此得到了扩展。…...

自制游戏:监狱逃亡

第一个游戏&#xff0c;不喜勿喷&#xff1a; #include<bits/stdc.h> #include<windows.h> using namespace std; int xz; int ruond_1(int n){if(xz1){printf("撬开了&#xff0c;但站在你面前的是俄罗斯内务部特种部队的奥摩大帝&#xff0c;你被九把加特…...

小雪时节,阴盛阳衰,注意禁忌

宋张嵲《小雪作》 霜风一夜落寒林&#xff0c;莽苍云烟结岁阴。 把镜渐无勋业念&#xff0c;爱山唯驻隐沦心。 冰花散落衡门静&#xff0c;黄叶飘零一迳深。 世乱身穷无可奈&#xff0c;强将悲慨事微吟。 网络图片&#xff1a;小雪时节 笔者禁不住喟然而叹&#xff1a;“冰…...

CPU性能优化--微操作

x86 架构处理器吧复杂的CISC指令转为简单的RISC微操作。这样做最大的优势是微操作可以乱序执行&#xff0c;一条简单的相加指令--比如ADD&#xff0c;EAX, EBX&#xff0c;只产生一个微操作&#xff0c;而很多复杂指令--比如ADD, EAX 可能会产生两个微操作&#xff0c;一个将数…...

工厂模式

主要解决对象的创建问题 首先是简单工厂 只有一个工厂类&#xff0c;每次有新的产品就需要修改里面接口的内容&#xff0c;违反了封闭原则 //1、定义抽象产品类 class AbstractCar { public:AbstractCar() default;virtual ~AbstractCar() default;virtual void showName(…...

嵌入式系统与OpenCV

目录 一、OpenCV 简介 二、嵌入式 OpenCV 的安装方法 1. Ubuntu 系统下的安装 2. 嵌入式 ARM 系统中的安装 3. Windows10 和树莓派系统下的安装 三、嵌入式 OpenCV 的性能优化 1. 介绍嵌入式平台上对 OpenCV 进行优化的必要性。 2. 利用嵌入式开发工具&#xff0c;如优…...

编程之路,从0开始:动态内存笔试题分析

Hello大家好&#xff0c;很高兴我们又见面啦&#xff01; 给生活添点passion&#xff0c;开始今天的编程之路。 今天我们来看几个经典的动态内存笔试题。 1、题目1 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> void GetMemory(char* …...

物联网研究实训室建设方案

一、引言 随着物联网技术的快速发展&#xff0c;其在各个行业的应用越来越广泛&#xff0c;对物联网专业人才的需求也日益增加。为满足这一需求&#xff0c;建设一个符合现代化教学需求的物联网研究实训室&#xff0c;对于提高学生的实践能力和创新能力具有重要意义。本方案旨…...

Mac vscode 激活列编辑模式

列编辑模式在批量处理多行文本时&#xff0c;非常有效&#xff0c;但 vscode 默认情况下&#xff0c;又没有激活&#xff0c;因此记录一下启动方法&#xff1a; 激活列编辑模式 然后就可以使用 Alt&#xff08;Mac 上是 Option 或 Command 键&#xff09; 鼠标左键 滑动选择了…...

深度学习:GPT-1的MindSpore实践

GPT-1简介 GPT-1&#xff08;Generative Pre-trained Transformer&#xff09;是2018年由Open AI提出的一个结合预训练和微调的用于解决文本理解和文本生成任务的模型。它的基础是Transformer架构&#xff0c;具有如下创新点&#xff1a; NLP领域的迁移学习&#xff1a;通过最…...

前端图像处理(一)

目录 一、上传 1.1、图片转base64 二、图片样式 2.1、图片边框【border-image】 三、Canvas 3.1、把canvas图片上传到服务器 3.2、在canvas中绘制和拖动矩形 3.3、图片(同色区域)点击变色 一、上传 1.1、图片转base64 传统上传&#xff1a; 客户端选择图片&#xf…...

unity中:超低入门级显卡、集显(功耗30W以下)运行unity URP管线输出的webgl程序有那些地方可以大幅优化帧率

删除Global Volume&#xff1a; 删除Global Volume是一项简单且高效的优化措施。实测表明&#xff0c;这一改动可以显著提升帧率&#xff0c;甚至能够将原本无法流畅运行的场景变得可用。 更改前的效果&#xff1a; 更改后的效果&#xff1a; 优化阴影和材质&#xff1a; …...

ftdi_sio应用学习笔记 4 - I2C

目录 1. 查找设备 2. 打开设备 3. 写数据 4. 读数据 5. 设置频率 6 验证 6.1 遍历设备 6.2 开关设备 6.3 读写测试 I2C设备最多有6个&#xff08;FT232H&#xff09;&#xff0c;其他为2个。和之前的设备一样&#xff0c;定义个I2C结构体记录找到的设备。 #define FT…...

如何更好的把控软件测试质量

如何更好的把控软件测试质量 在软件开发过程中&#xff0c;测试是确保软件质量、稳定性和用户体验的重要环节。随着需求的不断变化以及技术的不断进步&#xff0c;如何更好的把控软件测试质量已成为一个不可忽视的话题。本文将从几个维度探讨确保软件质量的方法和方案&#xf…...

“漫步北京”小程序及“气象景观数字化服务平台”上线啦

随着科技的飞速发展&#xff0c;智慧旅游已成为现代旅游业的重要趋势。近日&#xff0c;北京万云科技有限公司联合北京市气象服务中心&#xff0c;打造的“气象景观数字化服务平台“和“漫步北京“小程序已经上线&#xff0c;作为智慧旅游的典型代表&#xff0c;以其丰富的功能…...

SOL链上的 Meme 生态发展:从文化到创新的融合#dapp开发#

一、引言 随着区块链技术的不断发展&#xff0c;Meme 文化在去中心化领域逐渐崭露头角。从 Dogecoin 到 Shiba Inu&#xff0c;再到更多细分的 Meme 项目&#xff0c;这类基于网络文化的加密货币因其幽默和社区驱动力吸引了广泛关注。作为近年来备受瞩目的区块链平台之一&…...

身份证实名认证API接口助力电商购物安全

亲爱的网购达人们&#xff0c;你们是否曾经因为网络上的虚假信息和诈骗而感到困扰&#xff1f;在享受便捷的网购乐趣时&#xff0c;如何确保交易安全成为了我们共同关注的话题。今天&#xff0c;一起来了解一下翔云身份证实名认证接口如何为电子商务保驾护航&#xff0c;让您的…...