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

云南省建设厅网站处长四川网站建设开发

云南省建设厅网站处长,四川网站建设开发,什么平台可以发网推广,打开一个网站慢引言 之前写了 Requests 自动重试的文章#xff0c;突然想到#xff0c;之前还用到过 Requests 自动加解密请求的逻辑#xff0c;分享一下。之前在做逆向的时候#xff0c;发现一般医院的小程序请求会这么玩#xff0c;请求数据可能加密也可能不加密#xff0c;但是返回…引言 之前写了 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, modeAES.MODE_ECB):aes AES.new(k.encode(), mode)result aes.encrypt(pad(data.encode(), block_size16))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(fget timestamp is :{request.headers.get(x-timestamp)})print(fget sign is :{request.headers.get(x-sign)})print(fjson 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(fbefore encrypt data is:{data})d encrypt(headers.get(nonce).replace(-, )[:16], json.dumps(data))print(fafter encrypt data is:{d})return Response(json.dumps({data: d}), headersheaders, mimetypeapplication/json)if __name__ __main__:app.run(debugTrue) 这里通过 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, modeAES.MODE_ECB):aes AES.new(k.encode(), mode)result aes.decrypt(base64.b64decode(data))return unpad(result, block_size16).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(frequest.headers: {request.headers})print(frequest.body: {request.body.decode()})response super().send(request, **kwargs)print(fresponse.headers: {response.headers})print(fresponse.body: {response.text})if response.headers.get(x-encrypt) true:k response.headers.get(nonce).replace(-, )[:16]enc response.json().get(data)print(fencrypt data: {enc})r decrypt(k, enc, AES.MODE_ECB)print(fdecrypt data: {r})setattr(response, _content, r.encode())return responsereturn responseif __name__ __main__:session CustomSession()res session.post(urlhttp://127.0.0.1:5000/, json{data: test123})print(fresponse 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 字段并且经过处理后将数据加密返回给客户端。 抓包验证 接下来抓包验证一下是否如上文所说的响应是加密的请求是明文的 响应 请求 从截图中可以看到在发送请求时请求是明文的在接收到响应时响应是加密的这里其实可以拓宽一下如果我们将请求加密那么整个请求和响应就都是加密的了但是因为重写了 session 的 send 方法其实并不会对整体的业务代码有很大的入侵可以更加方便的更改或者判断是否需要加解密应该如何加密和解密。这里提供了极大的灵活性并且可以做到对业务 0 入侵。 总结 以上就是自动加解密的所有逻辑了希望对大家有所帮助。
http://www.w-s-a.com/news/996636/

相关文章:

  • php网站开发概念网站开发岗位职责任职责格
  • asp 网站源码 下载西安自适应网站建设
  • 白领兼职做网站贵阳网站设计哪家好
  • 热水器网站建设 中企动力企业网站开发需要多钱
  • 北京市建设工程信息网交易网站静态网页模板免费下载网站
  • 福田欧曼服务站网站前台设计
  • 网站做系统叫什么软件吗注册域名需要实名认证吗
  • jsp网站开发教学视频ui设计风格
  • 注册网站建设开发怎么自己做导航网站
  • 设计做网站品牌咖啡主题网页界面设计
  • 个人网站制作总体设计宿迁房价2023年最新房价
  • 服装网站建设进度及实施过程马鞍山网站设计制作
  • 郑州网站优化顾问济宁网站制作
  • 网站开发简单吗网站引导页分为三个板块设计风格
  • 湖南做网站 在线磐石网络百度一下百度搜索
  • 现在建网站多少钱推广营销费
  • 联想企业网站建设的思路西安网站建设阳建
  • 网站内容 内链网站建设电话销售工作总结
  • 系统网站开发知名的摄影网站有哪些
  • 网站拍照的幕布扬中网站建设价位
  • 网站ie兼容性差西安小程序开发的公司
  • 上海网站建设培训app网站开发成本
  • 个人网站icp外贸网站开发 河南
  • 遵义建设网站无锡市规划建设局网站
  • 海外留学网站建设方案门户网站的发布特点
  • 网站建设不赚钱net112企业建站系统
  • 网站建设团队管理模板贵州省住房和城乡建设部网站
  • 曲沃网站建设网上学编程的有哪些比较好的网站
  • 厦门网站建设慕枫学做网站需要多久
  • 爱奇艺做任务领vip网站设计广告图片