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 |
|
Header
Header包含了JWT使用的算法和类型等元数据信息,通常使用JSON对象表示并使用Base64编码,Header中包含两个字段:alg和typ
alg(algorithm):指定了使用的加密算法,常见的有HMAC、RSA和ECDSA等算法
typ(type):指定了JWT的类型,通常为JWT
下面是一个示例Header:
1 |
|
其中alg指定了使用HMAC-SHA256算法进行签名,typ指定了JWT的类型为JWT
Payload
Payload包含了JWT的主要信息,通常使用JSON对象表示并使用Base64编码,Payload中包含三个类型的字段:注册声明、公共声明和私有声明
公共声明(Public Claims):是自定义的字段,用于传递非敏感信息,例如:用户ID、角色等
私有声明(Private Claims):是自定义的字段,用于传递敏感信息,例如密码、信用卡号等
注册声明(Registered Claims):预定义的标准字段,包含了一些JWT的元数据信息,例如:发行者、过期时间等
下面是一个示例Payload:
1 |
|
其中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 |
|
从本身的结构中我们可以看到,如果只是通过简单的base64拼接我们很容易就可以伪造其token,但是如果采用了第二种方式则对数据进行了校验,可能就需要一些复杂的步骤来进行身份伪造。
下面是jwt的官网所给我们提供的图片,通过这张图片很容易就可以看出详细结构。