JWT令牌生成採用非對稱加密演算法

奶粉喝多了發表於2020-11-02

JWT令牌生成採用非對稱加密演算法

1、生成金鑰證照 下邊命令生成金鑰證照,採用RSA 演算法每個證照包含公鑰和私鑰

keytool -genkeypair -alias changgou -keyalg RSA -keypass changgou -keystore changgou.jks -storepass changgou
Keytool 是一個java提供的證照管理工具

-alias:金鑰的別名
-keyalg:使用的hash演算法
-keypass:金鑰的訪問密碼
-keystore:金鑰庫檔名,changgou.jks儲存了生成的證照
-storepass:金鑰庫的訪問密碼

查詢證照資訊:

keytool -list -keystore changgou.jks

2、匯出公鑰

openssl是一個加解密工具包,這裡使用openssl來匯出公鑰資訊。

安裝 openssl:http://slproweb.com/products/Win32OpenSSL.html

安裝資料目錄下的Win64OpenSSL-1_1_1b.exe

配置openssl的path環境變數,

cmd進入changgou.jks檔案所在目錄執行如下命令:

keytool -list -rfc --keystore changgou.jks | openssl x509 -inform pem -pubkey
1558222853425

下面段內容是公鑰

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz+oyAm
t47whAaRkRu/8kePM+X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnh
cP8ZfxGUH26kX0RK+tlrxcrG+HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEm
oLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/
iNKotQNnvIAKtjBM4RlIDWMa6dmz+lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZS
xtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv
9QIDAQAB
-----END PUBLIC KEY-----
將上邊的公鑰拷貝到文字public.key檔案中,合併為一行,可以將它放到需要實現授權認證的工程中。

3.3.2 認證服務中建立測試類
public class CreateJwtTest {

/***
* 建立令牌測試
*/
@Test
public void testCreateToken(){
//證照檔案路徑
String key_location=“changgou.jks”;
//祕鑰庫密碼
String key_password=“changgou”;
//祕鑰密碼
String keypwd = “changgou”;
//祕鑰別名
String alias = “changgou”;

//訪問證照路徑
ClassPathResource resource = new ClassPathResource(key_location);

//建立祕鑰工廠
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource,key_password.toCharArray());

//讀取祕鑰對(公鑰、私鑰)
KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias,keypwd.toCharArray());

//獲取私鑰
RSAPrivateKey rsaPrivate = (RSAPrivateKey) keyPair.getPrivate();

//定義Payload
Map<String, Object> tokenMap = new HashMap<>();
tokenMap.put(“id”, “1”);
tokenMap.put(“name”, “itheima”);
tokenMap.put(“roles”, “ROLE_VIP,ROLE_USER”);

//生成Jwt令牌
Jwt jwt = JwtHelper.encode(JSON.toJSONString(tokenMap), new RsaSigner(rsaPrivate));

//取出令牌
String encoded = jwt.getEncoded();
System.out.println(encoded);
}
}

3.4 基於公鑰解析jwt令牌
上面建立令牌後,我們可以對JWT令牌進行解析,這裡解析需要用到公鑰,我們可以將之前生成的公鑰public.key拷貝出來用字串變數token儲存,然後通過公鑰解密。

在changgou-user-oauth建立測試類com.changgou.token.ParseJwtTest實現解析校驗令牌資料,程式碼如下:

public class ParseJwtTest {

/***
* 校驗令牌
*/
@Test
public void testParseToken(){
//令牌
String token = “eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6IlJPTEVfVklQLFJPTEVfVVNFUiIsIm5hbWUiOiJpdGhlaW1hIiwiaWQiOiIxIn0.IR9Qu9ZqYZ2gU2qgAziyT38UhEeL4Oi69ko-dzC_P9-Vjz40hwZDqxl8wZ-W2WAw1eWGIHV1EYDjg0-eilogJZ5UikyWw1bewXCpvlM-ZRtYQQqHFTlfDiVcFetyTayaskwa-x_BVS4pTWAskiaIKbKR4KcME2E5o1rEek-3YPkqAiZ6WP1UOmpaCJDaaFSdninqG0gzSCuGvLuG40x0Ngpfk7mPOecsIi5cbJElpdYUsCr9oXc53ROyfvYpHjzV7c2D5eIZu3leUPXRvvVAPJFEcSBiisxUSEeiGpmuQhaFZd1g-yJ1WQrixFvehMeLX2XU6W1nlL5ARTpQf_Jjiw”;

//公鑰
String publickey = “-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz+oyAmt47whAaRkRu/8kePM+X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnhcP8ZfxGUH26kX0RK+tlrxcrG+HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEmoLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/iNKotQNnvIAKtjBM4RlIDWMa6dmz+lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZSxtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv9QIDAQAB-----END PUBLIC KEY-----”;

//校驗Jwt
Jwt jwt = JwtHelper.decodeAndVerify(token, new RsaVerifier(publickey));

//獲取Jwt原始內容
String claims = jwt.getClaims();
System.out.println(claims);
//jwt令牌
String encoded = jwt.getEncoded();
System.out.println(encoded);
}
}

相關文章