jwt(一)

Java Web Token

  JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

  jwt网址:https://jwt.io/

简介

  通俗地说,JWT的本质就是一个字符串,用来验证用户身份。

  了解详情参考:https://www.cnblogs.com/zhuangzilian/p/15911689.html

结构

  本身的介绍是比较抽象的,但是了解其不同的构造方式也是有利于我们进行渗透。

  下面是jwt本身的结构

1
2
3
4
<1> 
base64(header).base64(payload)
<2>
base64(header).base64(payload).HMACSHA256(base64urlencode(header)+"."+base64urlencode(payload)+secret)

  Header包含了JWT使用的算法和类型等元数据信息,通常使用JSON对象表示并使用Base64编码,Header中包含两个字段:alg和typ
alg(algorithm):指定了使用的加密算法,常见的有HMAC、RSA和ECDSA等算法
typ(type):指定了JWT的类型,通常为JWT

  下面是一个示例Header:

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

  其中alg指定了使用HMAC-SHA256算法进行签名,typ指定了JWT的类型为JWT

Payload

  Payload包含了JWT的主要信息,通常使用JSON对象表示并使用Base64编码,Payload中包含三个类型的字段:注册声明、公共声明和私有声明

  公共声明(Public Claims):是自定义的字段,用于传递非敏感信息,例如:用户ID、角色等
  私有声明(Private Claims):是自定义的字段,用于传递敏感信息,例如密码、信用卡号等
  注册声明(Registered Claims):预定义的标准字段,包含了一些JWT的元数据信息,例如:发行者、过期时间等
  下面是一个示例Payload:

1
2
3
4
5
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}

  其中sub表示主题,name表示名称,iat表示JWT的签发时间

Signature

  Signature是使用指定算法对Header和Payload进行签名生成的,用于验证JWT的完整性和真实性,Signature的生成方式通常是将Header和Payload连接起来然后使用指定算法对其进行签名,最终将签名结果与Header和Payload一起组成JWT,Signature的生成和验证需要使用相同的密钥,下面是一个示例Signature

  HMACSHA256(base64UrlEncode(header) + “.” +base64UrlEncode(payload),secret)
其中HMACSHA256是使用HMAC SHA256算法进行签名,header和payload是经过Base64编码的Header和Payload,secret是用于签名和验证的密钥,最终将Header、Payload和Signature连接起来用句点(.)分隔就形成了一个完整的JWT,下面是一个示例JWT,其中第一部分是Header,第二部分是Payload,第三部分是Signature,注意JWT 中的每一部分都是经过Base64编码的,但并不是加密的,因此JWT中的信息是可以被解密的

1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

  从本身的结构中我们可以看到,如果只是通过简单的base64拼接我们很容易就可以伪造其token,但是如果采用了第二种方式则对数据进行了校验,可能就需要一些复杂的步骤来进行身份伪造。

  下面是jwt的官网所给我们提供的图片,通过这张图片很容易就可以看出详细结构。

jwt


jwt(一)
https://fliggyaa.github.io/2023/10/21/2023-10-21-jwt/
作者
fliggy
发布于
2023年10月21日
许可协议