JAva-jwtツールクラス
JWT公式サイト:https://jwt.io/
1.JWTとは
JSON Web Token(JWT)は非常に軽量な仕様です.この仕様では、JWTを使用して、ユーザーとサーバの間で安全で信頼性の高い情報を伝達できます.
2.JWT構成
JWTは実際には文字列で、頭部、荷重、ビザの3つの部分から構成されています.
ヘッダは、JWTに関する最も基本的な情報、例えば、そのタイプや署名に使用されるアルゴリズムなどを記述するために使用される.これをJSONオブジェクトとして表すこともできます.
ヘッダには、署名アルゴリズムがHS 256アルゴリズムであることが示されている.BASE 64符号化を行いますhttps://base64.supfree.net/を選択します.
小知識:Base 64は、64個の印刷可能文字に基づいてバイナリデータを表す表現方法である.2の6乗は64に等しいので、6ビットごとに1つのユニットであり、印刷可能な文字に対応する.3バイトは24ビットであり、4つのBase 64ユニットに対応する.すなわち、3バイトは4つの印刷可能な文字で表す必要がある.JDKではBASE 64 EncoderとBASE 64 Decoderが非常に便利に提供されており、BASE 64ベースの符号化と復号化を非常に容易に行うことができます.
荷重は有効な情報を格納する場所です.
(1)規格に登録されている声明(推奨されるが強制されない)
(2)共通の声明
共通の声明は、一般的にユーザの関連情報やその他の業務に必要な情報を追加する任意の情報を追加することができるが、クライアントで復号可能であるため、機密情報を追加することは推奨されない.
(3)私有声明
プライベート宣言は、base 64が対称的に復号されているため、一部の情報が明文情報に分類されることを意味するため、プロバイダと消費者が共同で定義した宣言であり、一般的には機密情報の格納は推奨されない.
これはカスタムclaimを指します.例えば、前述の構造例のadminとnameはいずれもカスタムclaimに属する.これらのclaimとJWT規格で規定されているclaimの違いは、JWTで規定されているclaimであり、JWTの受信者はJWTを受け取った後、これらの規格のclaimをどのように検証するかを知っている(検証できるかどうかはまだ分からない).private claimsは、受信者にこれらのclaimを検証し、ルールを明確に伝えない限り検証しません.
payloadを定義します.
その後base 64を暗号化してJwtの第2の部分を得る.
JWTはビザ情報で、secretは鍵で、自分で定義した3つの部分から構成されています.
この部分はbase 64暗号化後のヘッダーとbase 64暗号化後のpayloadを使用する必要があります.接続された文字列は、ヘッダーに宣言された暗号化方式で加塩secretを組み合わせて暗号化され、jwtの第3部分を構成します.(headerのはただ1つの情報が他の人にどんなアルゴリズムを使ったかを教えて、実際にはこれは書かなくてもいいです.javaの中のツールは彼が自動的にheaderの中の情報を生成します)
この3つの部分を完全な文字列に接続し、最終的なjwtを構成します.
注意:secretはサーバ側に保存され、jwtの署名生成もサーバ側にあり、secretはjwtの署名とjwtの検証を行うために使用されるので、それはあなたのサービス側の秘密鍵であり、いかなるシーンでも漏らすべきではありません.クライアントがこのsecretを知ったら、クライアントはjwtを自己発行できることを意味します.
JJJWT版
JWT(Java版)のgithubアドレス:https://github.com/jwtk/jjwt 以下はjjwtのjavaツールクラスの使用です:Maven導入依存:
auth 0のjava-jwt
公式住所:https://github.com/auth0/java-jwt maven導入:
次の操作を行います.
補足:
JWTアルゴリズム比較テスト:https://www.cnblogs.com/langshiquan/p/10701198.html
1.JWTとは
JSON Web Token(JWT)は非常に軽量な仕様です.この仕様では、JWTを使用して、ユーザーとサーバの間で安全で信頼性の高い情報を伝達できます.
2.JWT構成
JWTは実際には文字列で、頭部、荷重、ビザの3つの部分から構成されています.
(Header)
ヘッダは、JWTに関する最も基本的な情報、例えば、そのタイプや署名に使用されるアルゴリズムなどを記述するために使用される.これをJSONオブジェクトとして表すこともできます.
{"typ":"JWT","alg":"HS256"}
ヘッダには、署名アルゴリズムがHS 256アルゴリズムであることが示されている.BASE 64符号化を行いますhttps://base64.supfree.net/を選択します.
JTdCJTIydHlwJTIyJTNBJTIySldUJTIyJTJDJTIyYWxnJTIyJTNBJTIySFMyNTYlMjIlN0Q=
小知識:Base 64は、64個の印刷可能文字に基づいてバイナリデータを表す表現方法である.2の6乗は64に等しいので、6ビットごとに1つのユニットであり、印刷可能な文字に対応する.3バイトは24ビットであり、4つのBase 64ユニットに対応する.すなわち、3バイトは4つの印刷可能な文字で表す必要がある.JDKではBASE 64 EncoderとBASE 64 Decoderが非常に便利に提供されており、BASE 64ベースの符号化と復号化を非常に容易に行うことができます.
(playload)
荷重は有効な情報を格納する場所です.
(1)規格に登録されている声明(推奨されるが強制されない)
iss: jwt
sub: jwt
aud: jwt
exp: jwt ,
nbf: , jwt .
iat: jwt
jti: jwt , token, 。
(2)共通の声明
共通の声明は、一般的にユーザの関連情報やその他の業務に必要な情報を追加する任意の情報を追加することができるが、クライアントで復号可能であるため、機密情報を追加することは推奨されない.
(3)私有声明
プライベート宣言は、base 64が対称的に復号されているため、一部の情報が明文情報に分類されることを意味するため、プロバイダと消費者が共同で定義した宣言であり、一般的には機密情報の格納は推奨されない.
これはカスタムclaimを指します.例えば、前述の構造例のadminとnameはいずれもカスタムclaimに属する.これらのclaimとJWT規格で規定されているclaimの違いは、JWTで規定されているclaimであり、JWTの受信者はJWTを受け取った後、これらの規格のclaimをどのように検証するかを知っている(検証できるかどうかはまだ分からない).private claimsは、受信者にこれらのclaimを検証し、ルールを明確に伝えない限り検証しません.
payloadを定義します.
{"sub":"test","name":"John","admin":true}
その後base 64を暗号化してJwtの第2の部分を得る.
JTdCJTIyc3ViJTIyJTNBJTIydGVzdCUyMiUyQyUyMm5hbWUlMjIlM0ElMjJKb2huJTIyJTJDJTIyYWRtaW4lMjIlM0F0cnVlJTdE
(signature)
JWTはビザ情報で、secretは鍵で、自分で定義した3つの部分から構成されています.
header (base64 )
payload (base64 )
secret
この部分はbase 64暗号化後のヘッダーとbase 64暗号化後のpayloadを使用する必要があります.接続された文字列は、ヘッダーに宣言された暗号化方式で加塩secretを組み合わせて暗号化され、jwtの第3部分を構成します.(headerのはただ1つの情報が他の人にどんなアルゴリズムを使ったかを教えて、実際にはこれは書かなくてもいいです.javaの中のツールは彼が自動的にheaderの中の情報を生成します)
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
この3つの部分を完全な文字列に接続し、最終的なjwtを構成します.
JTdCJTIydHlwJTIyJTNBJTIySldUJTIyJTJDJTIyYWxnJTIyJTNBJTIySFMyNTYlMjIlN0Q=.JTdCJTIyc3ViJTIyJTNBJTIydGVzdCUyMiUyQyUyMm5hbWUlMjIlM0ElMjJKb2huJTIyJTJDJTIyYWRtaW4lMjIlM0F0cnVlJTdE.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
注意:secretはサーバ側に保存され、jwtの署名生成もサーバ側にあり、secretはjwtの署名とjwtの検証を行うために使用されるので、それはあなたのサービス側の秘密鍵であり、いかなるシーンでも漏らすべきではありません.クライアントがこのsecretを知ったら、クライアントはjwtを自己発行できることを意味します.
JJJWT版
JWT(Java版)のgithubアドレス:https://github.com/jwtk/jjwt 以下はjjwtのjavaツールクラスの使用です:Maven導入依存:
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-apiartifactId>
<version>0.10.7version>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-implartifactId>
<version>0.10.7version>
<scope>runtimescope>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-jacksonartifactId>
<version>0.10.7version>
<scope>runtimescope>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
<version>3.9version>
dependency>
package com.sise.JWT;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.apache.commons.lang3.StringUtils;
import javax.crypto.SecretKey;
/**
* @author:Tlimited
*
*/
public class JwtUtil {
private static final long EXPIRE = 60 * 1000; //
public static final SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);// ,
/**
* token
*
* @param claims map
* @return
*/
public static String generate(Map<String,Object> claims) {
Date nowDate = new Date();
// ,
Date expireDate = new Date(System.currentTimeMillis() + EXPIRE);
// ,
Map<String, Object> header = new HashMap<>(2);
header.put("typ", "jwt");
// ,JDK11
// KeyPair keyPair = Keys.keyPairFor(SignatureAlgorithm.RS256);
// PrivateKey key1 = keyPair.getPrivate(); //
//PublicKey key2 = keyPair.getPublic(); //
return Jwts.builder().setHeader(header)
// .setSubject("weimi")//
// .setIssuer("weimi") //
.setClaims(claims) // claims
.setIssuedAt(nowDate)//
.setExpiration(expireDate) //
.signWith(key)// key
.compact();
}
/**
* token
* @param header map
* @param claims map
* @return
*/
public static String generate( Map<String, Object> header,Map<String,Object> claims) {
Date nowDate = new Date();
// ,
Date expireDate = new Date(System.currentTimeMillis() + EXPIRE);
return Jwts.builder().setHeader(header)
// .setSubject("weimi")//
// .setIssuer("weimi") //
.setClaims(claims) // claims
.setIssuedAt(nowDate)//
.setExpiration(expireDate) //
.signWith(key)// key
.compact();
}
/**
* jwt
* @param token
* @return
*/
public static boolean isSigned(String token){
return Jwts.parser()
.setSigningKey(key)
.isSigned(token);
}
/**
*
* @param token
* @return
*/
public static boolean verify(String token){
try {
Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token);
return true;
}catch (JwtException e){
System.out.println(e.getMessage());
return false;
}
}
/**
* payload ( )
* : userId:getClaim(token).get("userId");
* @param token
* @return
*/
public static Claims getClaim(String token) {
Claims claims = null;
try {
claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
e.printStackTrace();
}
return claims;
}
/**
* map
* : getHeader(token).get("alg");
* @param token
* @return
*/
public static JwsHeader getHeader(String token) {
JwsHeader header = null;
try {
header = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getHeader();
} catch (Exception e) {
e.printStackTrace();
}
return header;
}
/**
* jwt
*/
public static Date getIssuedAt(String token) {
return getClaim(token).getIssuedAt();
}
/**
* jwt
*/
public static Date getExpiration(String token) {
return getClaim(token).getExpiration();
}
/**
* token
*
* @param token
* @return true: false:
*/
public static boolean isExpired(String token) {
try {
final Date expiration = getExpiration(token);
return expiration.before(new Date());
} catch (ExpiredJwtException expiredJwtException) {
return true;
}
}
/**
* Base64 header
* @param token
* @return
*/
public static String getHeaderByBase64(String token){
String header = null;
if (isSigned(token)){
try {
byte[] header_byte = Base64.getDecoder().decode(token.split("\\.")[0]);
header = new String(header_byte);
}catch (Exception e){
e.printStackTrace();
return null;
}
}
return header;
}
/**
* Base64 payload
* @param token
* @return
*/
public static String getPayloadByBase64(String token){
String payload = null;
if (isSigned(token)) {
try {
byte[] payload_byte = Base64.getDecoder().decode(token.split("\\.")[1]);
payload = new String(payload_byte);
}catch (Exception e){
e.printStackTrace();
return null;
}
}
return payload;
}
public static void main(String[] args) {
// claims
Map<String,Object> map = new HashMap<>();
map.put("userId","test122");
String token = generate(map);
System.out.println(token);
System.out.println("claim:" + getClaim(token).get("userId"));
System.out.println("header:" + getHeader(token));
// System.out.println(getIssuedAt(token));
Claims claims=getClaim(token);
// System.out.println(getHeaderByBase64(token));
System.out.println(getPayloadByBase64(token));
SimpleDateFormat sdf=new SimpleDateFormat("yyyy‐MM‐dd hh:mm:ss");
System.out.println(" :"+sdf.format(claims.getIssuedAt()));
System.out.println(" :"+sdf.format(claims.getExpiration()));
System.out.println(" :"+sdf.format(new Date()) );
}
}
auth 0のjava-jwt
公式住所:https://github.com/auth0/java-jwt maven導入:
<dependency>
<groupId>com.auth0groupId>
<artifactId>java-jwtartifactId>
<version>3.9.0version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
<version>3.9version>
dependency>
次の操作を行います.
package com.sise;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import org.apache.commons.lang3.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
*@author:Tlimited
*/
public class Auth0JwtUtils {
// 15
private static final long EXPIRE_TIME = 15* 60 * 1000;
//
private static final String TOKEN_SECRET = "privateKey";
/**
* ,15
* , 6 ,Integer,Long,Boolean,Double,String,Date
* @param map
* @return
*/
public static String sign(Map<String,Object> map) {
try {
//
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
//
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
//
Map<String, Object> header = new HashMap<>(2);
header.put("typ", "jwt");
// token
JWTCreator.Builder builder = JWT.create()
.withHeader(header)
.withIssuedAt(new Date()) //
.withExpiresAt(date); //
// .sign(algorithm); //
// map.entrySet().forEach(entry -> builder.withClaim( entry.getKey(),entry.getValue()));
map.entrySet().forEach(entry -> {
if (entry.getValue() instanceof Integer) {
builder.withClaim( entry.getKey(),(Integer)entry.getValue());
} else if (entry.getValue() instanceof Long) {
builder.withClaim( entry.getKey(),(Long)entry.getValue());
} else if (entry.getValue() instanceof Boolean) {
builder.withClaim( entry.getKey(),(Boolean) entry.getValue());
} else if (entry.getValue() instanceof String) {
builder.withClaim( entry.getKey(),String.valueOf(entry.getValue()));
} else if (entry.getValue() instanceof Double) {
builder.withClaim( entry.getKey(),(Double)entry.getValue());
} else if (entry.getValue() instanceof Date) {
builder.withClaim( entry.getKey(),(Date)entry.getValue());
}
});
return builder.sign(algorithm);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* token
* @param **token**
* @return
*/
public static boolean verify(String token){
try {
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier = JWT.require(algorithm).build();
verifier.verify(token);
return true;
} catch (Exception e){
e.printStackTrace();
return false;
}
}
/**
* Claim
* @param token
* @return
*/
public static Map<String, Claim> getClaims(String token){
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier = JWT.require(algorithm).build();
Map<String, Claim> jwt = verifier.verify(token).getClaims();
return jwt;
}
/**
*
* @param token
* @return
*/
public static Date getExpiresAt(String token){
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
return JWT.require(algorithm).build().verify(token).getExpiresAt();
}
/**
* jwt
*/
public static Date getIssuedAt(String token){
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
return JWT.require(algorithm).build().verify(token).getIssuedAt();
}
/**
* token
*
* @param token
* @return true: false:
*/
public static boolean isExpired(String token) {
try {
final Date expiration = getExpiresAt(token);
return expiration.before(new Date());
}catch (TokenExpiredException e) {
// e.printStackTrace();
return true;
}
}
/**
* Base64 header
* @param token
* @return
*/
public static String getHeaderByBase64(String token){
if (StringUtils.isEmpty(token)){
return null;
}else {
byte[] header_byte = Base64.getDecoder().decode(token.split("\\.")[0]);
String header = new String(header_byte);
return header;
}
}
/**
* Base64 payload
* @param token
* @return
*/
public static String getPayloadByBase64(String token){
if (StringUtils.isEmpty(token)){
return null;
}else {
byte[] payload_byte = Base64.getDecoder().decode(token.split("\\.")[1]);
String payload = new String(payload_byte);
return payload;
}
}
public static void main(String[] args) throws InterruptedException {
Map<String,Object> map = new HashMap<>();
map.put("userId","123456");
map.put("rose","admin");
map.put("integer",1111);
map.put("double",112.222);
map.put("Long",112L);
map.put("bool",true);
map.put("date",new Date());
String token = sign(map); // token
System.out.println(verify(token));// token
String dd = getClaims(token).get("userId").asString(); //
System.out.println(dd);
System.out.println(" token :" +getIssuedAt(token));
System.out.println(" :"+getExpiresAt(token));
// Thread.sleep(1000*40);
System.out.println(" :"+isExpired(token));
System.out.println(" "+getHeaderByBase64(token));
System.out.println(" "+getPayloadByBase64(token));
}
}
補足:
JWTアルゴリズム比較テスト:https://www.cnblogs.com/langshiquan/p/10701198.html