base64编码解码,下面两个在线工具任选一个玩一玩,工具上有简单介绍原理
在线base64编码解码工具
base64编码转换工具
base64在线编码解码
JWT官网 https://jwt.io/
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
JWT.IO allows you to decode, verify and generate JWT.
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。JWT表现为一串看不懂的乱七八糟的字符串,JWT常用于做认证授权,Java中spring security、spring security oauth2 经常需要用到,其实不用也行,用起来X格高啊
三、JWT样例官网样例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
一个典型的JWT看起来是这个样子的:
xxxxx.yyyyy.zzzzz四、JWT的结构
JWT 由三部分组成,它们之间用圆点(.)连接。按顺序这三部分分别是
Header(头)Payload(负载)Signature(签名) 1.Header
Header是描述JWT元数据的JSON对象
{ "alg": "HS256", "typ": "JWT" }
alg:签名使用的算法,默认为HMAC SHA256(写为HS256);
typ:令牌的类型,JWT令牌统一写为JWT
用base64对这个JSON编码就得到JWT的第一部分
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ92.Payload
有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT的第二部分是payload,它包含claim(声明 要求)。claim有三种类型: registered, public 和 private。
Registered claims 这里有一组预定义的声明,它们不是强制的,但是推荐。Public claims 可以随意定义。Private claims 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明
Registered claims 官方指定的7个默认字段
iss:发行人 exp:到期时间 sub:主题 aud:用户 nbf:在此之前不可用 iat:发布时间 jti:JWT ID用于标识该JWT
定义一个简易的Payload
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
对payload进行base64编码就得到JWT的第二部分
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
3.Signature默认情况下JWT是未加密的,因为只是采用base64算法,不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息,拿到JWT字符串后可以转换回原本的JSON数据,不要将用户密码构建到payload中,以防止信息泄露。JWT只是适合在网络中传输一些非敏感的信息
签名部分是对Header和Payload两部分数据签名,需要使用base64编码后的header和payload数据,通过Header中指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
签名是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
在计算出签名哈希后,Header,Payload,Signature 用.分隔构建成JWT
五、JWT每个部分的作用借官网的一张图说话
六、Java怎么生成JWTheader和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法和令牌类型,从payload中获取有效数据。
signature由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。服务端获取header中的加密算法之后,利用该算法加上secretKey对header、payload进行加密,比对加密后的数据和客户端发送过来的是否一致。注意secretKey只能保存在服务端,而且对于不同的加密算法其含义有所不同,一般对于MD5类型的摘要加密算法,secretKey实际上代表的是盐值
很简单,jar包引入,百度copy一下有手就行
https://jwt.io/libraries
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)