JWT - Json Web Token

JWT - Json Web Token

六月 04, 2023

JWT简介

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

JWT结构

JWT由三部分组成,它们之间用圆点.连接
e4618556f211ee5fc2842dcde0e99b12.png

1
2
3
1、Header	-->头部
2、Payload -->负载
3、Signature -->签名
1
拼接组成JWT:Header.Payload.Signature
  1. Header:alg和typ

    1
    2
    alg: ALGORITHM	//算法名称
    typ:TOKEN TYPE //token类型
    1
    2
    3
    4
    5
    //例:
    {
    "alg":"HS256",
    "typ":"JWT"
    }
  2. Payload(有效载荷):用来存放实际需要传递的数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    1. Registered claims (标准中注册的声明) 
    JWT 规定了7个官方字段,这些是一组预定义的claims,非强制性的,供选用。
    iss (issuer):签发人
    exp (expiration time):过期时间
    sub (subject):主题
    aud (audience):受众
    nbf (Not Before):生效时间
    iat (Issued At):签发时间
    jti (JWT ID):编号
    2. Public claims (公共的声明)
    可以随意定义。自定义claims,注意不要和JWT注册表中属性冲突,这里可以查看JWT注册表。
    3.Private claims (私有的声明)
    这些是自定义的claims,用于在同意使用这些claims的各方之间共享信息,它们既不是Registered claims,也不是Public claims。
    1
    2
    3
    4
    5
    6
    //例:
    {
    "sub":12356"", //主题
    "name":"John Doe", //自定义私有字段名字
    "iat":12312312 //签发时间
    }
  3. Signature(签名):对前两部分的签名,防止数据篡改

    • 三部分base64编码后用.拼接
    • 提供一个密钥(secret)用Header所规定的算法加密,形成新的字符串
      1
      2
      3
      4
      5
      HMACSHA256(
      base64UrlEncode(header)+"."+
      base65UrlEncode(payload),
      your-256-bit-secret
      )

      JWT特点

    1. JWT 默认是不加密,但也是可以加密的。
    2. JWT 不加密的情况下,不能将秘密数据写入 JWT。
    3. JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
    4. JWT 签发了,在到期之前就会始终有效,因为服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或更改 token 的权限。
    5. JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。
    6. JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

弱密钥爆破payload

  • 工具:JWT cracker
    1
    2
    #usage
    docker build . -t jwtcrack xxxxxxxxxxxxxx.xxxxxxxx.xxxxx