什么是JWT?
JSON Web令牌(Json Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对对JWT进行签名。
组成是什么?
JWT主要分成三个部分组成,这些部分由点(.)分隔:
第一部分:header: 头部 标记使用什么算法。如HS256等。
第二部分:PayLoad(载荷):jwt存放的数据
第三部分:sign: PayLoad采用MD5加密后的签名值格式为:xxxxx.yyyyy.zzzzz
举例一下:
标头
{
"alg": "HS256",
"typ": "JWT"
}`
载荷
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}`
签名
如果要使用HMAC SHA256算法,则将通过以下方式创建签名:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JWT的生成
- Base64.ENcode ( header). Base64.ENcode ( PayLoad).签名值
注意:
- Base64 不属于对称加密,属于一种编码方式。header和 payload都是用Base64编码,而签名一般采用的是不可逆的hash(ma5)算法。
下面附上一些简单的代码实现
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JWT {
//签名key 设置盐值 (注意盐值的不能低于三个,低于三个会报错)
private static String SIGN_KEY = "wsw123";
public static void main(String[] args) {
//创建jwt
JwtBuilder jwtBuilder = Jwts.builder().claim("phone", "1335860166")
//设置签名值
.signWith(SignatureAlgorithm.HS256, SIGN_KEY);
System.out.println(jwtBuilder.compact());
}
}
运行结果为(是一个格式为:xxxxx.yyyyy.zzzzz):
eyJhbGciOiJIUzI1NiJ9.
eyJwaG9uZSI6IjEzMzU4NjAxNjYifQ.
0qhhcLJP-VItLB3VdAc37vtCnOMaBd-60xrdx0dlIHo
将其对应到JWT官网上:
https://jwt.io/#debugger-io
我将代码中的盐值输入进去,就会得到下面截图: