最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用JWT創(chuàng)建解析令牌及RSA非對(duì)稱加密詳解

 更新時(shí)間:2023年11月16日 08:29:03   作者:立小研先森  
這篇文章主要介紹了JWT創(chuàng)建解析令牌及RSA非對(duì)稱加密詳解,JWT是JSON Web Token的縮寫,即JSON Web令牌,是一種自包含令牌,一種情況是webapi,類似之前的阿里云播放憑證的功能,另一種情況是多web服務(wù)器下實(shí)現(xiàn)無狀態(tài)分布式身份驗(yàn)證,需要的朋友可以參考下

依賴

開源依賴pom引用地址

<dependency>
  <groupId>io.github.mingyang66</groupId>
  <artifactId>oceansky-jwt</artifactId>
  <version>4.3.2</version>
</dependency>

一、如何使用Java代碼的方式生成RSA非對(duì)稱秘鑰

public class RsaPemCreatorFactory {
    /**
     * 公鑰文件名
     */
    private static final String PUBLIC_KEY_FILE = "publicKey.pem";
    /**
     * 私鑰文件名
     */
    private static final String PRIVATE_KEY_FILE = "privateKey.pem";
    private static final String publicKeyPrefix = "PUBLIC KEY";
    private static final String privateKeyPrefix = "PRIVATE KEY";
    /**
     * 算法
     */
    public static final String ALGORITHM = "RSA";
    public static void create(String directory) throws NoSuchAlgorithmException, IOException {
        // algorithm 指定算法為RSA
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
        // 指定密鑰長度為2048
        keyPairGenerator.initialize(1024);
        // 生成密鑰
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 文件夾不存在,則先創(chuàng)建
        Files.createDirectories(Paths.get(directory));
        try (FileWriter writer = new FileWriter(String.join("", directory, PRIVATE_KEY_FILE));
             PemWriter pemWriter = new PemWriter(writer);
             FileWriter pubFileWriter = new FileWriter(String.join("", directory, PUBLIC_KEY_FILE));
             PemWriter pubPemWriter = new PemWriter(pubFileWriter)) {
            pemWriter.writeObject(new PemObject(privateKeyPrefix, keyPair.getPrivate().getEncoded()));
            pubPemWriter.writeObject(new PemObject(publicKeyPrefix, keyPair.getPublic().getEncoded()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

二、如何創(chuàng)建RSAPublicKey、RSAPrivateKey對(duì)象

public class RsaAlgorithmFactory {
    public static final String N = "\n";
    public static final String R = "\r";
    public static final String ALGORITHM = "RSA";

    /**
     * 獲取公鑰對(duì)象
     *
     * @param publicKey 公鑰字符串
     * @return 公鑰對(duì)象
     * @throws InvalidKeySpecException
     * @throws NoSuchAlgorithmException
     */
    public static RSAPublicKey getPublicKey(String publicKey) throws InvalidKeySpecException, NoSuchAlgorithmException {
        if (publicKey == null || publicKey.length() == 0) {
            throw new IllegalArgumentException("非法參數(shù)");
        }
        byte[] keyBytes = Base64.getDecoder().decode(publicKey.replace(N, "").replace(R, "").getBytes(StandardCharsets.UTF_8));
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        return (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
    }

    /**
     * 獲取私鑰對(duì)象
     *
     * @param privateKey 私鑰字符串
     * @return 私鑰對(duì)象
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     */
    public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] keyBytes = Base64.getDecoder().decode(privateKey.replace(N, "").replace(R, "").getBytes(StandardCharsets.UTF_8));
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        return (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
    }
}

三、如何創(chuàng)建解析JWT Token

創(chuàng)建工廠方法:

public class JwtFactory {
    /**
     * 創(chuàng)建JWT Token字符串
     *
     * @param builder   入?yún)?
     * @param algorithm 算法
     * @return token字符串
     */
    public static String createJwtToken(JWTCreator.Builder builder, Algorithm algorithm) {
        // header:typ、alg 算法
        return builder.sign(algorithm);
    }

    /**
     * JWT字符串解碼后的對(duì)象
     *
     * @param jwtToken  令牌
     * @param algorithm 算法
     * @return 解析后的jwt token對(duì)象
     */
    public static DecodedJWT verifyJwtToken(String jwtToken, Algorithm algorithm) {
        JWTVerifier jwtVerifier = JWT.require(algorithm).build();
        return jwtVerifier.verify(jwtToken);
    }
}

實(shí)際使用案例:

    @Test
    public void test() throws InvalidKeySpecException, NoSuchAlgorithmException {
        RSAPublicKey publicKey = RsaAlgorithmFactory.getPublicKey(publicKey1);

        //Security.addProvider(new BouncyCastleProvider());
        RSAPrivateKey privateKey = RsaAlgorithmFactory.getPrivateKey(privateKey1);
        System.out.println(privateKey.getFormat());
        Map<String, Object> headers = new HashMap<>();
        headers.put("ip", "123.12.123.25.12");
        JWTCreator.Builder builder = JWT.create()
                //JWT唯一標(biāo)識(shí) jti
                .withJWTId(UUID.randomUUID().toString())
                .withHeader(headers)
                .withClaim("username", "田潤葉")
                .withClaim("password", "不喜歡")
                //發(fā)布者 iss
                .withIssuer("顧養(yǎng)民")
                //發(fā)布時(shí)間 iat
                .withIssuedAt(Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()))
                //受眾|收件人 aud
                .withAudience("田海民", "孫玉婷")
                //指定JWT在指定時(shí)間之前不得接受處理  nbf
                .withNotBefore(Date.from(LocalDateTime.now().plusMinutes(-1).atZone(ZoneId.systemDefault()).toInstant()))
                //JWT的主題 sub
                .withSubject("令牌")
                //JWT的密鑰ID(實(shí)際未用到),用于指定簽名驗(yàn)證的密鑰 kid  com.auth0.jwt.algorithms.RSAAlgorithm.verify
                .withKeyId("sd")
                //JWT過期時(shí)間 exp
                .withExpiresAt(LocalDateTime.now().plusMinutes(5).atZone(ZoneId.systemDefault()).toInstant());
        String jwtToken = JwtFactory.createJwtToken(builder, Algorithm.RSA256(publicKey, privateKey));
        Assert.assertNotNull(jwtToken);

        DecodedJWT jwt = JwtFactory.verifyJwtToken(jwtToken, Algorithm.RSA256(publicKey, privateKey));
        Assert.assertEquals(jwt.getClaim("username").asString(), "田潤葉");
        Assert.assertEquals(jwt.getClaim("password").asString(), "不喜歡");
        Assert.assertEquals(jwt.getHeaderClaim("ip").asString(), "123.12.123.25.12");
        Assert.assertEquals(jwt.getIssuer(), "顧養(yǎng)民");
        Assert.assertEquals(jwt.getAudience().get(0), "田海民");
        Assert.assertEquals(jwt.getAudience().get(1), "孫玉婷");
    }

到此這篇關(guān)于使用JWT創(chuàng)建解析令牌及RSA非對(duì)稱加密詳解的文章就介紹到這了,更多相關(guān)JWT創(chuàng)建解析令牌內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot整合kaptcha驗(yàn)證碼的示例代碼

    springboot整合kaptcha驗(yàn)證碼的示例代碼

    kaptcha是一個(gè)很有用的驗(yàn)證碼生成工具,本篇文章主要介紹了springboot整合kaptcha驗(yàn)證碼的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • 使用PageHelper插件實(shí)現(xiàn)Service層分頁

    使用PageHelper插件實(shí)現(xiàn)Service層分頁

    這篇文章主要為大家詳細(xì)介紹了使用PageHelper插件實(shí)現(xiàn)Service層分頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • JDBC自定義連接池過程詳解

    JDBC自定義連接池過程詳解

    這篇文章主要介紹了JDBC自定義連接池過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Lombok同時(shí)使?@Data和@Builder踩坑總結(jié)

    Lombok同時(shí)使?@Data和@Builder踩坑總結(jié)

    這篇文章主要介紹了Lombok同時(shí)使?@Data和@Builder踩坑總結(jié),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-05-05
  • Java如何實(shí)現(xiàn)N叉樹數(shù)據(jù)結(jié)構(gòu)

    Java如何實(shí)現(xiàn)N叉樹數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了Java如何實(shí)現(xiàn)N叉樹數(shù)據(jù)結(jié)構(gòu)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringCloud-Alibaba-Sentinel-配置持久化策略詳解

    SpringCloud-Alibaba-Sentinel-配置持久化策略詳解

    這篇文章主要介紹了SpringCloud-Alibaba-Sentinel-配置持久化策略,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • IDEA導(dǎo)入Eclipse項(xiàng)目全過程

    IDEA導(dǎo)入Eclipse項(xiàng)目全過程

    這篇文章介紹了如何將Eclipse項(xiàng)目導(dǎo)入到IntelliJ IDEA,并詳細(xì)步驟如下:新建一個(gè)文件夾,用IntelliJ IDEA打開,將項(xiàng)目導(dǎo)入,等待編譯完成,配置項(xiàng)目環(huán)境和結(jié)構(gòu),注意文件夾名稱可能不同,配置Tomcat,重新編譯項(xiàng)目并啟動(dòng)
    2025-11-11
  • idea?與?maven?使用過程中遇到的問題及解決方案

    idea?與?maven?使用過程中遇到的問題及解決方案

    最近將IDEA 升級(jí)到 IntelliJ IDEA 2021.3.2,在將maven項(xiàng)目導(dǎo)入IDEA后,maven build時(shí)報(bào)異常,這個(gè)問題是IntelliJ IDEA 2021.3.2 不兼容導(dǎo)致的,下面小編給大家?guī)砹薸dea?與?maven?使用過程中遇到的問題及解決方案,感興趣的朋友一起看看吧
    2022-05-05
  • Java中filter用法完整代碼示例

    Java中filter用法完整代碼示例

    這篇文章主要介紹了Java中filter用法完整代碼示例,分享了瀏覽器不緩存頁面的過濾器,檢測用戶是否登陸的過濾器等相關(guān)實(shí)例,小編覺得還是挺不錯(cuò)的,這里分享給大家,需要的朋友可以參考下
    2018-01-01
  • String類的獲取功能、轉(zhuǎn)換功能

    String類的獲取功能、轉(zhuǎn)換功能

    這篇文章給大家介紹了String類的獲取功能:String類的基本獲取功能、獲取功能的舉例子、String類的基本轉(zhuǎn)換功能、轉(zhuǎn)換功能的舉例子。具體詳情大家參考下本文
    2018-04-04

最新評(píng)論

宁陵县| 陕西省| 屯门区| 贵定县| 景东| 华容县| 临洮县| 互助| 中宁县| 林周县| 那坡县| 宝应县| 页游| 五寨县| 商南县| 双流县| 昌图县| 庆城县| 怀宁县| 苗栗市| 宁化县| 彝良县| 金华市| 镇宁| 峡江县| 固阳县| 方城县| 通河县| 云安县| 阿勒泰市| 万州区| 元氏县| 襄城县| 梁平县| 体育| 建宁县| 新化县| 盐源县| 南和县| 磴口县| 白城市|