彻底搞懂JWT令牌

什么是JWT?

JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止被篡改。

JWT令牌的优点

1、jwt基于json,非常方便解析。
2、可以在令牌中自定义丰富的内容,易扩展。
3、通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。

JWT令牌结构

JWT令牌由Header、Payload、Signature三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz
在这里插入图片描述
1)Header

头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)。

一个例子:

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

将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。

HS256就是HMAC-SHA256,加密算法使用HMAC,摘要算法使用SHA256。

测试:

将生成的jwt令牌第一部分使用Base64还原原始内容如下:

    public static void main(String[] args) {
        byte[] header = java.util.Base64.getDecoder().decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9");
        System.out.println(new String(header));
    }

得到的结果是:

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

2)Payload

第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比
如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。
此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。
一个例子:

    {
    	"sub": "1234567890",
    	"name": "456",
    	"admin": true
    }

最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。

3)Signature

第三部分是签名,此部分用于防止jwt内容被篡改。
这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明
签名算法进行签名。
一个例子:

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

base64UrlEncode(header):jwt令牌的第一部分。
base64UrlEncode(payload):jwt令牌的第二部分。
secret:签名所使用的密钥。

JWT三个部分只有第三部分是加密的,通过数字签名机制,我们既可以保证数据完整性,也可以对数据来源进行身份验证。

什么是签名?

签名是数字签名,发送方将消息原文使用摘要算法生成摘要,再用私钥对摘要进行加密,生成数字签名。

传输数据时为了保证数据的完整性可以使用数字签名技术:

1、发送方使用私钥对内容进行数字签名

2、将内容附带数字签名发送给对方

3、对方收到内容和数字签名,使用公钥进行验签(相当于解密的过程),如果发现内容不一致则说明传输过程被篡改。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值