JWT 安全


0X01 什么是jwt?

JWT 全称 JSON Web Token,是一种标准化格式,用于在系统之间发送加密签名的 JSON 数据。

原始的 Token 只是一个 uuid,没有任何意义。

JWT的结构由三部分组成,分别是Header、Payload和Signature,下面是每一部分的详细介绍和示例:

Header 部分

在 JWT 中 Header 部分存储的是 Token 类型和加密算法,通常使用JSON对象表示并使用Base64编码,其中包含两个字段:alg和typ

  • alg(algorithm):指定了使用的加密算法,常见的有HMAC、RSA和ECDSA等算法
  • typ(type):指定了JWT的类型,通常为JWT

下面是一个示例Header:

{
  "alg": "HS256", 
  "typ": "JWT"
}

Payload 部分

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

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

下面是一个示例Payload:

{
  "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中的信息是可以被解密的

下面是一个示例JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

from:

https://forum.butian.net/share/2734