使用Python+Flask+HTML写一个测试小工具

news2024/11/19 23:12:32

背景:
由于公司安全规范限制,我司的测试、预发布、灰度、生产环境,接口间的数据通信通常是加密处理的,给我们日常定位缺陷带来了一定的阻碍,因此我决定使用Python写一个工具,将加密数据转换为正常数据,便于日常问题定位。

在这里插入图片描述

由于是第一次写页面化的测试工具,我将把自己的思路做完整的记录,便于日后回归以及套用。
工具开发思路:
1.先使用Python,根据安全规则,实现接口间数据的解密方法
2.使用flask框架,将接口间的数据解密方式封装成接口,并且能在本地正常调试
3.使用HTML编写工具的静态页面
4.使用HTML调用封装的接口,从而完成工具的开发

具体实现:

一、 安全规则为:
 1.客户端使用aes密钥去加密接口入参,生成密文1
 2.客户端使用rsa的公钥去加密aes密钥生成密文2
 3.客户端向服务端发送请求的时候,会将密文1、密文一并传输到服务端
 4.服务端使用rsa的私钥去解密密文1,得到aes的密钥
 5.服务到使用步骤4解密出来的aes密钥,去解密密文2,得到接口的入参

根据数据间的加解密规则可以看出,安全规则的加密规范是rsa+aes混合加密,其中aes是对称加密,rsa是非对称加密。对称加密简单的来说是可以通过一个密钥完成数据的加解密,非对称加密是使用公钥加密,私钥解密。

我们能够在接口的入参和header头中获取到已加密的信息,因此我们仅需要关注解密过程(安全规则的4、5步骤)

二、实现rsa解密&aes解密:
  想要实现rsa解密,需要获取2个关键信息:
  1.rsa的私钥
  2.需要解密的信息
  
  具体代码实现如下:
  def decode_by_rsa(self, **my_json):
    '''
    解密
    '''
    rsa_key = '-----BEGIN RSA PRIVATE KEY-----\n' + my_json["body"]["rsa_key"] + '\n -----END RSA PRIVATE KEY-----'
    message_info = my_json["body"]["message_info"]
    try:
        if rsa_key and message_info != '':

            pri_key = RSA.importKey(rsa_key)
            cipher = PKCS1_cipher.new(pri_key)
            back_text = cipher.decrypt(base64.b64decode(message_info), 0)
            return responseData.response(200, "解密成功", {'data': back_text.decode('utf-8')})
        elif rsa_key or message_info == '':
            return responseData.response(-1, "解密失败", {'data': "参数不能为空!"})

    except Exception as e:
        return responseData.response(-1, "解密失败", {'data': f"参数格式错误:{e}"})
想要实现aes解密,需要知道3个关键信息
1.aes密钥
2.待解密信息
3.加密模式
具体实现代码如下:
def decode_by_aes(self, **my_json):  # **my_json 使用** 将入参封装成一个字典
    '''
    aes解密
    '''
    message_info = my_json["body"]["message_info"]
    aes_key = my_json["body"]["aes_key"]
    try:
        if aes_key and message_info != "":
            script_key = aes_key.encode('utf-8')
            mode = AES.MODE_ECB
            cryptor = AES.new(script_key, mode)
            res = cryptor.decrypt(base64.decodebytes(message_info.encode("utf-8")))
            # 去除填充
            un_padded_data = unpad(res, AES.block_size, style='pkcs7')
            return responseData.response(200, "解密成功", {'data': un_padded_data.decode('utf-8')})
        elif aes_key or message_info == "":
            return responseData.response(-1, "解密失败", {'data': "参数不能为空!"})
    except Exception as e:
        return responseData.response(-1, "解密失败", {'data': f"参数格式错误:{e}"})

   

三、使用flask框架将对应的方法封装成接口

   1.将解密方法封装到一个类中,并将该类置于flask框架的Common层
   2.在根目录创建一个.py文件,充当程序入口

在这里插入图片描述
.py文件中的代码实现如下:

from flask import Flask, render_template, jsonify, request
from flask_cors import CORS
from Common.encryption_and_decryption_tool import EncryptionAndDecryption


app = Flask(__name__, static_url_path=None, static_folder='static')
# static_folder这里是在指定静态资源的文件夹,因此需要与框架中的静态资源文件名称保持一致
CORS(app)  # 跨域资源共享,避免游览器安全策略限制,导致接口端口号发生更改
app.config["JSON_AS_ASCII"] = False  # 确保返回的json字符串中中文可以正常显示


@app.route('/', methods=["GET", "POST"]) # 定义接口的路径和支持的请求方法
def index():
    return render_template("tool.html")  # 跳转至指定的静态资源页面


@app.route("/decode_api", methods=["GET", "POST"])
def decode_api():
    try:
        my_json = request.get_json()  # 从前端请求种获取json格式的数据,并将其存储到变量my_json中

        return getattr(EncryptionAndDecryption(), my_json['pubRequest']['method'])(**my_json)
        # 这样写是为了兼容我司接口入参规范,具体规范参照本地调试的入参格式
        # 这行代码使用 getattr() 函数获取 EncryptionAndDecryption() 实例对象的某个方法,并根据传入的 my_json 参数中的 pubRequest
        # 字段的 method 值来决定调用哪个方法。**my_json 则是将 my_json 参数中的所有键值对作为关键字参数传递给该方法
        

    except Exception as e:   # 使用try ...except 对异常进行处理,保证程序能完整执行,不会因为异常而中断

        return f"请求错误{e}"


if __name__ == '__main__':
    app.run(host="0.0.0.0", debug=True, port=5000)  
    # host:指定服务器绑定的IP地址,默认为"127.0.0.1",即本地回环地址。如果要让服务器能够被其他计算机访问,可以将它设置为"0.0.0.0"。
    # port:指定服务器监听的端口号,默认为5000
    # debug:启用调试模式,当代码发生错误时,会输出详细的错误信息和堆栈跟踪,便于调试和开发。 

本地调试:

 1.在本地运行.py的文件。将本机作为一台服务器,运行结果如下

在这里插入图片描述

   2.使用postman进行本地调试(由于公司的接口入参规范,因此我这里是按照我司的入参规规范进行调试的):

在这里插入图片描述

 四、编写html静态页面:
     我这个桌面工具的功能很简单,就是为了实现加密字符串的解密,因此我们的样式设置如下:
     功能描述:清除--将输入的内容全部删除;解析---根据输入内容去解密已加密的字符串

在这里插入图片描述

  五、页面调用对应接口,完成工具开发
      1.使用 XMLHttpRequest 对象向服务器发送请求

在这里插入图片描述

    2.引入对应的js文件,给按钮绑定点击事件

在这里插入图片描述

   3.页面效果及功能展示:

在这里插入图片描述

在这里插入图片描述

小结:

  这次小工具的开发,我使用到了Python的flask框架还有HTML,学会了HTML页面调用接口的方法,但是暂未实现前后端分离。这是我的第一个测试小工具,虽然很简单,但是在实现过程中还是遇到了很多问题,在解决这些问题的时候,我收获了不少知识。该文章仅做笔记使用,便于自己日后复习。


                          --------------------------------------------学海无涯

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

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

相关文章

vscode面板菜单字体太大或者太小解决方式【自留记录】

vscode面板菜单字体太大或者太小解决方式【自留记录】 菜单图标 - 设置 - 搜索栏输入 zoom - 输入 0 回车

jasny-bootstrap组件-文件上传

今天和大家分享jasny-bootstrap如何实现文件上传,以及同form表单同时提交处理。 目前各大网站关于jasny-bootstrap上传文件的案例demo少之又少,就连若依也只是一笔带过,只是做了一个纯效果展示。 经过博主的一番查阅文档,查找案例…

【Android安全】Flutter app逆向

使用《Flutter逆向助手》逆向Flutter app 参考:https://www.bilibili.com/video/BV1SM41147g5 flutter app特征: lib/armeabi-v7a/下面有libapp.so和libflutter.so 逆向分析工具: 看雪:Flutter逆向助手 可以解析libapp.so文件…

OpenCV——《直方图操作》和《模版匹配》

1.直方图均衡化 img cv2.imread(clahe.jpg,0) plt.hist(img.ravel(),256) plt.show() #旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。 equ cv2.equalizeHist(img) plt.hist(equ.ravel(),256) plt.show() #进行对比,均值化之后…

mapbox图层层级问题

如果在项目之初我们没有设计好图层的问题,那么大概率我们会与到预期图层在别的图层下面的问题,这是需要使用addlayer、movelayer方法来调整图层的位置了。 一般而言先添加的图层在显示的时候在后添加图层的下面,例如下面的代码: …

ChatGPT伪原创文章的应用与发展

ChatGPT是一种基于人工智能技术的自然语言处理模型,它能够生成逼真的、具有上下文连贯性的文本。近年来,ChatGPT在各个领域的应用越来越广泛,其发展潜力也逐渐被人们所认识。本文将从多个方面对ChatGPT的应用与发展进行详细阐述。 ChatGPT在…

人脸考勤签到进阶篇

目录 签到业务流程说明 一、需求介绍 二、如何获取地理信息? 三、如何判定某地区新冠疫情的风险等级? 开通腾讯位置服务 二、腾讯位置服务SDK 把定位坐标转换成真实地址 一、获取定位坐标 uni.authorize(OBJECT) 二、编辑签到页面 在Docker中…

如何在 Spring Boot 中使用反向代理

如何在 Spring Boot 中使用反向代理 介绍 在分布式系统中,反向代理是一项非常重要的技术。通过反向代理,可以将客户端的请求转发到后端的多台服务器上,实现负载均衡和故障转移等功能。本文将介绍如何在 Spring Boot 应用中使用反向代理。 环…

微信小程序判断用户是否授权定位

1、判断用户是否授权定位 checkLocationAuth() {let that thiswx.getSetting({success: (res) > {let authSetting res.authSettingif (authSetting[scope.userLocation]) {that.getCurrentLocation()} else if (authSetting[scope.userLocation] false) {wx.showModal(…

yxcms弱口令至getshell 漏洞复现

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 环境部署02 漏洞配置03 利用方式04 修复方案 01 环境部署 (1)yxcms yxcms 基于 PHPMySQL 开发,这是一个采用轻量级 MVC 设计模式的网站管理系统。轻量级 MVC 设…

【wifi模块应用】基于路由模块SKW92A的4G转WiFi、无线中继、视频传输方案

在家用WiFi,外出用4G,已经成为时下很多人的常规操作,尤其在室内环境中,无论是办公、居家,还是在高铁站、飞机场,亦或是酒店、咖啡馆等公共场所,我们都会下意识地主动连上WiFi。据悉,…

lenovo联想Yoga 13s 2021 AMD平台ACN版(82CY)原厂预装Win11系统镜像原装OEM恢复出厂状态

LENOVO联想笔记本电脑,Yoga 13s 2021 AMD平台ACN版(82CY)原装出厂Windows11系统,恢复原厂OEM预装专用系统 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式:…

星辰秘典:探索Python项目的神秘力量——贪吃蛇

✨博主:命运之光 🌸专栏:星辰秘典:探索Python项目的神秘力量 🐳专栏:web开发(html css js) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主…

Hive(10):Hive分桶表

1 分桶表的概念 分桶表也叫做桶表,叫法源自建表语法中bucket单词,是一种用于优化查询而设计的表类型。分桶表对应的数据文件在底层会被分解为若干个部分,通俗来说就是被拆分成若干个独立的小文件。在分桶时,要指定根据哪个字段将数据分为几桶(几个部分)。2 分桶表的规则 …

torch.cuda模块获取信息

判断GPU是否可用 import torch print(torch.cuda.is_available())如果输出True则表示可以使用GPU 输出可使用GPU的数量 import torch print(torch.cuda.device_count())输出1就表示只有一块可以用 输出GPU的名字 import torch print(torch.cuda.get_device_name())如果有…

如何在 VSCode 去调试 Redis源码

学习使用 Redis 时,从 GitHub 下载 Redis 源码是个不错的选择。在下载后,通过创建 task.json 和 launch.json 两个文件,可以方便地在本地进行 Redis 的编译、运行和调试。通过这些步骤,你可以更好地理解 Redis 的内部实现&#xf…

小程序 css flex的子元素图片被周边元素text挤压变形

flex下子元素会自动拉伸,第一个子元素image设置了100 * 100还是被后面的text过长文字挤压了。 解决: 方法1: 让图片不自动拉伸加上 flex:noe 方法2: flex下面所有的子元素都设置宽度,这个会比较麻烦,需要…

如何在Microsoft Excel中迅速冻结首行和末行

如果你正在处理一个大型电子表格,那么冻结某些行或列会很有用,这样当你滚动浏览工作表的其余部分时,它们会留在屏幕上。 当你在 Excel 中滚动浏览大的工作表时,你可能希望保留一些行或列,例如页眉。Excel 允许你通过以…

useReducer可配合react-redux方案

接下来 我们来看 useReducer 这个属性 配合 react-redux 就会非常好用 那么 我们编写一段这样代码 import React, { useState } from react;const ContDom () > {const [count, setCount] useState(0);return (<div>cont值{ count }<button onClick {()>{ …