【网络安全 | 密码学】JWT基础知识及攻击方式详析

news2025/1/15 23:51:51

前言

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解码就可以读取其中携带的信息。

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

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

相关文章

【C++类和对象】拷贝构造与赋值运算符重载

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

通过excel获取网站的数据信息

通过excel获取网站的数据信息,有时候网站数据的表格很多数据,需要梳理到表格中,如何用excel表格直接读取网站数据 备注问题:表格内容有时候在一行,很长,不方便处理 bug问题:不要多选&#xff0…

鸢尾花数据集分类(决策树,朴素贝叶斯,人工神经网络)

目录 一、决策树 二、朴素贝叶斯 三、人工神经网络 四、利用三种方法进行鸢尾花数据集分类 一、决策树 决策树是一种常用的机器学习算法,用于分类和回归任务。它是一种树形结构,其中每个内部节点表示一个特征或属性,每个分支代表这个特征…

元宇宙-虚拟世界的安全风险如何应对

元宇宙(Metaverse)是一个虚拟时空间的集合,由一系列的增强现实(AR)、虚拟现实(VR)和互联网(Internet)所组成。这个虚拟时空间是一个持续存在的、由众多虚拟世界互相连接而…

深度Q-Learning在算法交易中的应用

一、说明 在《华尔街的随机漫步》一书中,作者伯顿马尔基尔(Burton G. Malkiel)声称:“一只蒙着眼睛的猴子向报纸的财经版面投掷飞镖,可以选择一个与专家精心挑选的投资组合一样好的投资组合。 如果我们让巴甫洛夫的狗接…

Vue3从入门到实战:深度掌握组件通信(上部曲)

props的概念: 当你使用Vue 3的组合式API时,props就是一种让你可以从父组件向子组件传递数据的方式。你可以想象成你在给子组件写一封信,把需要传递的信息放在信封里。 在Vue 3中,你可以在子组件的代码中定义props,就…

javaWeb项目-校园交友网站功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、Java语言 Java语…

HTML部分常用标签补充

table(布局方面不建议使用,而是使用CSS来完成): 标签解释: ~table标签顾名思义,是表格的意思 ~table其中可以使用boder属性来显示表格的线,最好使用CSS来配合HTML的使用 ~table内的内容可以使用colspan来定…

2024运营级租房源码管理PHP后台+uniapp前端(app+小程序+H5)

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 房产系统 一款基于ThinkPHPUniapp开发的房产管理系统,支持小程序、H5、APP;包含房客、房东、经纪人三种身份。核心功能有:新盘销售、房屋租赁、地图找房、房源代理、…

数据结构(七)——B树和B+树

7.4.1_1 B树 5叉查找树 //5叉排序树的结点定义 struct Node {ElemType keys[4]; //最多4个关键字struct Node &child[5]; //最多5个孩子int num; //结点中有几个关键字 }; 如何保证查找效率? eg:对于5叉排序树,规定…

AWS Key disabler:AWS IAM用户访问密钥安全保护工具

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

aws云靶场和一些杂记

aws靶场 在AWS靶场中,存在三个安全问题:1) 一个S3存储桶政策配置错误,允许公共访问,通过访问特定域名可获取flag。2) SQS消息队列的政策没有限制角色,允许发送和接收消息,通过aws sqs命令行工具的receive-…

java八股文知识点讲解(个人认为讲的比较好的)

1、解决哈希冲突——链地址法:【第7章查找】19哈希表的查找_链地址法解决哈希冲突_哔哩哔哩_bilibili 2、解决哈希冲突——开放地址法 : 【第7章查找】18哈希表的查找_开放定址法解决哈希冲突_哔哩哔哩_bilibili 3、小根堆大根堆的创建:选择…

MR-JE-70A 三菱MR-JE伺服驱动器(750W通用型)

三菱MR-JE伺服驱动器(750W通用型) MR-JE-70A外部连接,MR-JE-70A用户手册,MR-JE-70A 三相或单相AC220V三菱通用型伺服放大器750W,配套电机HG-SN52J-S100、HG-KN73J-S100。 MR-JE-70A参数说明:伺服驱动器通用型750W,三相或单相AC200V~240V 三…

reportlab 生成pdf文件 (python)

1 安装 pip install reportlab2 应用场景 通过网页动态生成PDF文档大量的报告和数据发布用XML一步生成PDF 官网案例 3 PLATYPUS Platypus是“Page Layout and Typography Using Scripts”,是使用脚本的页面布局和印刷术的缩写,这是一个高层次页面布局…

媒体邀约的好处?怎么邀请媒体?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体邀约的好处主要体现在提高品牌知名度、扩大受众群体以及与媒体建立良好的合作关系。 媒体邀约是一种有效的公关策略,通过吸引媒体关注来促进信息的传播。它可以帮助组织…

【笔记】vscode debug进入site-packages包源码

选择左侧栏第三个图标,点击创建 launch.json 文件 选择 Python Debugger 选择Python文件 这里可以看到launch.json 文件 在configurations中添加键值对 "justMyCode": false在文件中打上断点,点击"三角符"号开始调试 按F11或者红框…

双向链表也叫双链表

双向链表也叫双链表 双向链表也叫双链表 每个节点都有两个指针,分别指向 直接前驱节点、直接后继节点 双向链表中任意一个节点,都可以通过通过它的前驱节点和后继节点,访问其他节点 节点如下 节点定义 ListNode // 节点的值 T element; /…

day12-1 | 二叉树 part-1 (Go) | 二叉树的理论基础

今日任务 二叉树的理论基础 ( 参考: 代码随想录) 二叉树种类 二叉树是一种基础数据结构,在算法面试中都是常客,也是众多数据结构的基石。二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有…

ArtCoder——通过风格转换生成多元化艺术风格二维码

简介 ArtCoder能够从原始图像(内容)、目标图像(风格)以及想要嵌入的信息中,生成具有艺术风格的二维码。这一过程类似于通常的图像风格转换,但特别针对二维码的特点进行了优化和调整。 通过这种方法&#…