【网络安全 | 密码学】JWT基础知识及攻击方式详析
前言
JWT(Json Web Token)是一种用于在网络应用之间安全地传输信息的开放标准。它通过将用户信息以JSON格式加密并封装在一个token中,然后将该token发送给服务端进行验证,从而实现身份验证和授权。
流程
JWT的加密和解密过程如下:
1、 生成JWT Token:
客户端登录成功后,服务器使用用户的信息(如用户ID、用户名等)以及服务器端的密钥,通过特定的加密算法(如HMACSHA256、RSA等)生成JWT Token。
2、发送JWT Token:
客户端将生成的JWT Token发送给服务器,通常是通过HTTP请求的头部Authorization字段或者其他方式发送。
3、服务器验证JWT Token:
服务器收到JWT Token后,首先会对Token进行解析,检查Token的格式是否正确,并获取到头部和载荷部分的内容。
然后,服务器使用存储在服务器端的密钥和相同的加密算法,对头部和载荷进行签名验证,以确认Token的真实性和完整性。
4、响应处理:
如果JWT Token验证成功,服务器可以根据用户的请求执行相应的操作,并向客户端返回相应的响应。
如果JWT Token验证失败,则服务器通常会返回相应的错误信息或拒绝服务。
认证区别
这里以传统Token验证方式与JWT验证方式做区分。
在传统Token方式中,用户登录成功后,服务端生成一个随机Token并分配给用户,同时在服务端(如数据库或缓存)保存一份Token记录。随后,用户在后续的请求中需携带该Token。服务端在接收到Token后,会进行数据库或缓存的查询,以验证Token的有效性和合法性,包括检查Token是否超时或被篡改。
在JWT方式中,用户登录成功后,服务端使用JWT生成一个随机Token,并将其发送给用户,服务端无需在数据库或缓存中保存Token记录。用户在后续的请求中需要携带该Token。服务端在接收到Token后,通过JWT对Token进行验证。
这两种方式的本质区别在于Token的验证和存储方式。
JWT组成
JWT包含三个部分:头部(Header)、载荷(Payload)和签名(Signature)。
1、头部(Header):头部包含了两部分信息,分别是令牌的类型(typ)和所使用的加密算法(alg),它们由json格式经base64url编码得到。(base64url编码:base64编码后,用 - 替代 +,用 _ 替代/)
例如:
{"alg": "HS256","typ": "JWT"
}
加密得到:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
该字符串成为了Header部分
2、载荷(Payload):载荷包含了要传输的用户信息,如用户ID、用户名等。此外,也可以包含其他自定义的信息。载荷的内容是经过base64url编码的,能够被解码。
例如:
{"name": "ice","phone": 123456789,"address": "ice.home"
}
编码得到:
eyJuYW1lIjoiaWNlIiwicGhvbmUiOjEyMzQ1Njc4OSwiYWRkcmVzcyI6ImljZS5ob21lIn0
该字符串成为了Payload部分
3、签名(Signature):签名用于验证token的真实性和完整性。签名是由头部、载荷以及密钥结合特定的加密算法生成的。
加密算法例如:
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),ice
)
本例中,对Header.Payload进行HS256加密(密钥为ice)后,再进行base64url加密,从而得到签名。
GJd4DLWt-IWWhE4ELHUXiLJjJG5C_HcvTY87c2s74Z0
最后将三段字符串通过.拼接起来就生成了JWT的token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaWNlIiwicGhvbmUiOjEyMzQ1Njc4OSwiYWRkcmVzcyI6ImljZS5ob21lIn0.GJd4DLWt-IWWhE4ELHUXiLJjJG5C_HcvTY87c2s74Z0
https://jwt.io/
可用于编码、解码和验证JSON Web Tokens(JWT):
JWT攻击方式
1、修改加密算法伪造token
JWT中最常用的两种算法为HMAC和RSA。
HMAC是一种对称加密算法,使用相同的密钥对传输信息进行加解密。
RSA是一种非对称加密算法,使用私钥加密明文,公钥解密密文。
若存在一场景:某应用程序在JWT传输过程中使用RSA算法,同时使用密钥ice对JWT token进行签名,公钥abc对签名进行验证。
{"alg" : "RS256","typ" : "jwt"
}
通常情况下密钥ice是无法获取到的,但是公钥abc却可以通过某些途径得到,此时将JWT的加密算法修改为HMAC,同时使用获取到的公钥abc作为算法的密钥,对token进行签名,发送到服务器端:
{"alg" : "HS256","typ" : "jwt"
}
服务器端会将RSA的公钥(abc)视为当前算法(HMAC)的密钥,而HMAC是对称加密算法,故服务器使用密钥abc对接收到的签名进行验证,从而造成token伪造问题。
2、None算法攻击绕过验证
在Header中指定alg为None,同时不添加signature,服务器在验证JWT时会认为这个JWT是不需要签名的,从而跳过了对签名的验证,直接信任JWT中的信息,实现伪造身份绕过服务器验证。
HEADER:
{"alg" : "None","typ" : "jwt"
}
Payload:
{"username" : "Admin"
}
生成的完整token为
ew0KCSJhbGciIDogIk5vbmUiLA0KCSJ0eXAiIDogImp3dCINCn0.ew0KCSJ1c2VyIiA6ICJBZG1pbiINCn0
3、KID参数
“kid” 是 JWT 头部中的一个可选参数,全称为 “Key ID”,它用于指定加密算法所使用的密钥。
例如:
{"alg": "HS256","typ": "JWT","kid": "signing_key"
}
或
{"alg": "HS256","typ": "JWT","kid": "/home/jwt/.ssh/pem"
}
由于该参数可控,将导致以下漏洞。
3.1任意文件读取
系统并不会验证kid参数路径指向的文件是否是有效的密钥文件。因此,在没有对参数进行过滤或验证的情况下,可造成任意文件读取。
例如:
{"alg" : "HS256","typ" : "jwt","kid" : "../../etc/passwd"
}
3.2SQL注入
"kid"参数也可能从数据库中提取数据,故存在SQL注入攻击的风险。
例如:
{"alg" : "HS256","typ" : "jwt","kid" : "ice' || union select 'users' -- "
}
3.3命令注入
若服务器后端使用的是Ruby,在读取密钥文件时使用了open函数,通过构造参数可能实现命令注入。
例如:
{"alg" : "HS256","typ" : "jwt","kid" : "/path/to/key_file|whoami"
}
其它语言可进行思路延申。
4、信息泄露
JWT确保的是数据传输过程中的完整性和真实性,而不是机密性。由于payload是使用Base64url编码的,相当于明文传输。因此,如果在payload中携带了敏感信息(例如存放密钥对的文件路径),那么仅对payload部分进行Base64url解码就可以读取其中携带的信息。
相关文章:

【网络安全 | 密码学】JWT基础知识及攻击方式详析
前言 JWT(Json Web Token)是一种用于在网络应用之间安全地传输信息的开放标准。它通过将用户信息以JSON格式加密并封装在一个token中,然后将该token发送给服务端进行验证,从而实现身份验证和授权。 流程 JWT的加密和解密过程如…...

Chrome修改主题颜色
注意:自定义Chrome按钮只在搜索引擎为Google的时候出现。...
大数据:【学习笔记系列】Flink基础架构
Apache Flink 是一个开源的流处理框架,用于处理有界和无界的数据流。Flink 设计用于运行在所有常见的集群环境中,并且能够以高性能和可扩展的方式进行实时数据处理和分析。下面将详细介绍 Flink 的基础架构组件和其工作原理。 1. Flink 架构概览 Flink…...
Debezium系列之:部署Debezium采集Oracle数据库的详细步骤
Debezium系列之:部署Debezium采集Oracle数据库的详细步骤 一、部署Debezium Oracle连接器二、Debezium Oracle 连接器配置三、添加连接器配置四、可插拔数据库与不可插拔数据库一、部署Debezium Oracle连接器 部署的详细步骤可以参考博主这篇技术文章: Debezium系列之:安装…...

C语言通过键盘输入给结构体内嵌的结构体赋值——指针法
1 需求 以录入学生信息(姓名、学号、性别、出生日期)为例,首先通过键盘输入需要录入的学生的数量,再依次输入这些学生的信息,输入完成后输出所有信息。 2 代码 #include<stdio.h> #include<stdlib.h>//…...

AWS Key disabler:AWS IAM用户访问密钥安全保护工具
关于AWS Key disabler AWS Key disabler是一款功能强大的AWS IAM用户访问密钥安全保护工具,该工具可以通过设置一个时间定量来禁用AWS IAM用户访问密钥,以此来降低旧访问密钥所带来的安全风险。 工具运行流程 AWS Key disabler本质上是一个Lambda函数&…...

【第1节】书生·浦语大模型全链路开源开放体系
目录 1 简介2 内容(1)书生浦语大模型发展历程(2)体系(3)亮点(4)全链路体系构建a.数据b 预训练c 微调d 评测e.模型部署f.agent 智能体 3 相关论文解读4 ref 1 简介 书生浦语 InternLM…...
代码随想录-链表 | 707设计链表
代码随想录-数组 | 707设计链表 LeetCode 707-设计链表解题思路代码复杂度难点总结 LeetCode 707-设计链表 题目链接 题目描述 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点…...

AIGC算法1:Layer normalization
1. Layer Normalization μ E ( X ) ← 1 H ∑ i 1 n x i σ ← Var ( x ) 1 H ∑ i 1 H ( x i − μ ) 2 ϵ y x − E ( x ) Var ( X ) ϵ ⋅ γ β \begin{gathered}\muE(X) \leftarrow \frac{1}{H} \sum_{i1}^n x_i \\ \sigma \leftarrow \operatorname{Var}(…...

【C语言】——字符串函数的使用与模拟实现(下)
【C语言】——字符串函数的使用与模拟实现(下) 前言五、长度受限类字符串函数5.1、 s t r n c p y strncpy strncpy 函数5.2、 s t r n c a t strncat strncat 函数5.3、 s t r n c m p strncmp strncmp 函数 六、 s t r s t r strstr strstr 函数6.1、函…...

mac安装nvm详细教程
0. 前提 清除电脑上原有的node (没有装过的可以忽略)1、首先查看电脑上是否安装的有node,查看node版本node -v2、如果有node就彻底删除nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}2、保证自己的电脑上有安装git,不然下载n…...

上线流程及操作
上节回顾 1 搜索功能-前端:搜索框,搜索结果页面-后端:一种类型课程-APIResponse(actual_courseres.data.get(results),free_course[],light_course[])-搜索,如果数据量很大,直接使用mysql,效率非常低--》E…...

MobX入门指南:快速上手状态管理库
一、什么是MobX MobX 是一个状态管理库,它可以让你轻松地管理应用程序的状态,并且可以扩展和维护。它使用观察者模式来自动传播你的状态的变化到你的 React 组件。 二、安装及配置 安装 MobX 和 MobX-React:你可以使用 npm 或 yarn 安装这…...
技术洞察:Selenium WebDriver中Chrome, Edge, 和IE配置的关键区别
综述 webdriver.EdgeOptions(), webdriver.ChromeOptions(), 和 webdriver.IeOptions() 都是 Selenium WebDriver 的配置类,用于定制化启动各自浏览器的设置。它们分别对应 Microsoft Edge,Google Chrome,和 Internet Explorer 浏览器。 每…...
使用自定义OCR提升UIE-X检测效果:结合PaddleOCR和UIE模型进行文档信息提取
在实际应用中,识别文档中的特定信息对于许多任务至关重要,例如发票识别、表格信息提取等。然而,由于文档的多样性和复杂性,传统的光学字符识别(OCR)技术可能无法准确识别文档中的信息。为了解决这个问题&am…...
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog con…...

.net反射(Reflection)
文章目录 一.概念:二.反射的作用:三.代码案例:四.运行结果: 一.概念: .NET 反射(Reflection)是指在运行时动态地检查、访问和修改程序集中的类型、成员和对象的能力。通过反射,你可…...

P1278 单词游戏 简单搜索+玄学优化
单词游戏 传送门 题目描述 Io 和 Ao 在玩一个单词游戏。 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。 游戏可以从任何一个单词开始。 任何单词禁止说两遍,游戏中只能使用给定词典中含有…...

软考 - 系统架构设计师 - 数据架构真题
问题 1: (相当于根据题目中提到的 4 点,说一下关系型数据库的缺点) (1).用户数量的剧增导致并发负载非常高,往往会达到每秒上万次读写请求。关系数据库应付每秒上万次的 SQL 查询还勉强可以,但是应付上万…...
Ubuntu22.04下opencv4.9.0环境的搭建
目录 1、更新系统包列表:2、安装依赖项:3、下载 OpenCV 源代码:4、编译和安装 OpenCV:5、配置环境变量:6、测试1、更新系统包列表: 在终端中执行以下命令,以确保系统包列表是最新的: sudo apt update2、安装依赖项: 安装构建 OpenCV 所需的依赖项: sudo apt inst…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...