JWT加密工具
2.JWT介绍
JSON Web Token(JWT),它定义了一种简洁的、自包含的协议格式,JWT可以使用HMAC算法或使用RSA的公钥/私钥对进行签名,防止被篡改。
JWT官网: https://jwt.io
JWT组成
JWT由三个部分组成:JWT头、有效载荷和签名
jwt头
{"typ":"jwt","alg":"HS256"}
在上面的代码中,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);type属性表示令牌的类型,JWT令牌统一写为JWT(需要额外设置)。
有效载荷
有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。
JWT指定七个默认字段供选择(不是必须的):
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT
除以上默认字段外,还可以自定义私有字段,比如:
{"username": "zhangsan","id": "123"}
请注意,默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。
签名Signature
签名部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。
然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
最终生成的jwt的字符串由三部分组成:
header(base64后的)
payload(base64后的)
Signature
例如:
eyJ0eXBlIjoiand0IiwiYWxnIjoiSFMyNTYifQ.eyJ1c2VybmFtZSI6InpoYW5nc2FuIn0.C13IdXCyBs4oALrcttCBQ5LMsl0pTNxwgwqsVW7lSPs
官网上可以查看jwt信息
2 生成jwt
导入jar
<!-- jwt -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
jwt工具类
package com.renr.worst.common.utils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import java.util.Date;
import java.util.Map;/*** jwt工具类*/
public class JwtUtils {// 密钥private final static String secret = "123456789qwertyui";/*** 生成jwt** @param claims* @return*/public static String createJwt(Map<String, Object> claims) {// 签名算法,表示sha256SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;//构造jwtJwtBuilder builder = Jwts.builder()//.setHeaderParam("type","jwt") // 设置头.setClaims(claims) // 设置载荷.setExpiration(new Date(System.currentTimeMillis() + 1800000)) // 设置过期时间.signWith(signatureAlgorithm, secret); // 使用指定算法设置签名//生成jwtreturn builder.compact();}/*** 解析,如果不符合,报异常** @param jsonWebToken* @return*/public static Claims parseJWT(String jsonWebToken) {try {Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(jsonWebToken).getBody();return claims;} catch (Exception ex) {throw new RuntimeException(ex.getMessage());}}
}
return claims;} catch (Exception ex) {throw new RuntimeException(ex.getMessage());}
}
}