Advertisement

根据JWK参数生成token

阅读量:
复制代码
    public class RsaJwtGenerator {
    public static void main(String[] args) {
        try {
            // 你的 JWK 参数
            String n = "yZw_hTRCpeKYeUkRdbAstk2z3WLto1kZrnLicg7dFgZHhoWbt9Qqej9wraZvE-8S85psNWiidQFGi_B99Ker-Pq3nKoz5ltJgdlN7YtwEeNhRzt4UYl_2tRZKUCujCD9l2UB7GbPGsfLjci9CQnEDjiUyAb2ahXxJl5AXMt111xdRxgUo3SQcC8E-_1Lizn3uPixz2CsH9Tj6HYf3-pd2aPQUD1d-G-S0vy-XLqRH7kvp9-loQBURNjvhD-TFAGp8-RfttvleAnyPfYJhlIORXhitHMM6bO1BUY5rfbxS4Fcb2NE3eaRqLFo3Jz9xr51YNdnEv3K2-KRKCfDlWSEfmCiK8MG4pILBYirxLlo16Xej6MpvrcE5v_dwG_fUmdl5pXMhGSrUyoi4daQZuCvQ_fOA3BzWvCCvrzRHxjZ1-O0A2yie-cqypjCsAZL1SONTsP8ZaO-0s_m9B4Sha547bFoo65fJcN3xWmlG5_bi48b10GOnfBCVusGNSq0T65BSSqJ582ZrpXr1fkI7ed0nAbTXm308PvCf-kVgd-MIH8xVkaiHOUnsabTt06q7wyF48g1z-wcq1K0GXokkVBqc26KVs_wwvcRyTPx3MxUPNhRxkWBoQhsgBPzwYdVg6lkCanuorBsfmRUrzGGRH0Ciz3iEQgIWm1QvvX-EDyyoTU";
            String e = "AQAB";
            String d = "CZOTbNdbpxeJWJGA888ngI1WUtjFIvIzhxbL7NEJ7Wbk9N3Z1LSOQ_pJduYl9pNvmgSmyS6sMNSbrkABK6LfR1dZa2amSnXhmvpgej0aWK8tSr3nbDAU06csiQoagGt8wDk7CyijA8mjwJtdZ1WAa5CCeLHj-IwMRV9KvV2ovk8T2zGooU8DIWEKYpHYicd6Hd4qTAhyhJyPKtaZkwBF7vWaCoWvtgJOvhjlTfBKvnAEdHvqGSiz2AVZ8zU13khp8zzQ0xXE45vNVuYd87RoGyKpxZqFbYBsw9BfIwVM1uJRKrVTaxrtpk6vBXOrlkortyrkKYHGpgUwEfE5mBoLNQPfirS4nosJsrGW9OXT74dZVKJaArUjhYvKtm68Evm_VhOH0LloXiUgf7YKW38vLgKrMJgTEj0_WJhDTYudUXb8-D2wy_deuDRtT19T0LxVp6v0-cpA52N2aTxoLir4CQcwI9pfLRLlcE_l3RbaaKKJrCE5g_KhtqYDFx_c2mHeM751mLOabON6I8uwSpFVcTM_D8Uq2gINiHKAX7Spb9bwyz9Lc7jaGebrWQNp61IZ5SWw4n2djJoTS0zEjyN2cQfSqKQ1fDzjwfFFE1AeplBoBiLzUFJNhKqfrpdx1CspoCOgAp3QAcwXqFicEkMrJcZGnJWM1DadbkwVWuDFBQ0";
            String p = "-vEPNxnAAycIXBWhXHz2c0VqoArskmXodHaCsaZaXLD_6wBw1_Oxzj5SL_PlRgTGlt8gh-j_nKN_Rr09AsNHNVk_m6IM3epwNFMR-hA9fQC25ekcvJNlF21EEG3vTi90HzE5I9Htun4j9HZk00DorV5hJtj8ACf-k7tOkmKc7N7M9Ym7PS0bjUz1ZvbTACge_0NFs_G79ilowYdsiLl_8Mq540RN6dhyREfWgIJGlxU5hqud4fExfccIuKLAbZ-djkMN4eg-72oZ1eNkli3FExhQ1GnWXDn5t_brem7jWWaqrMOKI6gI2WX_GwhA0qZiBDg9YyVC--dj4GPJipR6mw";
            String q = "zayfhs0KktFs_b2nSXH6F3jTyhP1_E6C6xq-UrLdvbVTo_sDFYzSfspCTgmr1CzmUu_E8-qhCZCkucQhVReLo7XdAizzliWpU54Y2wpT9UyH8hZuOB1lTWu7f8CAE_SbmTFTzVMfr_QvnaDGsawHtQ-PW_OfyaT4uSy1gQxadQWXNU03PQbO6MsD8jJ8IxVYtPoD0eRasZc9eTrX_QJyeSHDm3nZe5ym1fwish85Bw_aZeKqjmbVD-XMP5YNvRSkg0ua7gXY8tmIodE8_Fdx2EZ9VqiBGmgQF7QKLW6C9HptRwD4qC7SdgHQDjv9UEcyEme4fjPIygI9RdJIKm_obw";
            String dp = "cX_ai-d_q21aIJw_8Z8rsRNymJSYT9b7_sEjd8pwEICWH-qBH4u_njMd5UaBKtw6Hj8pbY97HZPtm0c4cylz6bNGS9RN0YmZ2nDALsRtqz5Je0-mibx4-tGW-X9fv5NDCGCxIXxv8-vdw1JRZCN1mgSYGIQH5uIwCQ2tChTEOXbEaUI0iAUA8zYdwMZexTFgY8A_pJXvl_U-xlnEQ0rzjSuETEC2pNAbTrrXUCScXPVioYC51lnLMsJ1NV2Xf320O4Ykn0r2PD9XFCDXe_2Tp4FV_d0o8Wnfgs-RzjydY_BFvgJrVplH91xkuAtRlnVe2928Fj3iQCF2USWRILbrhQ";
            String dq = "vwpa21FVQu54OHCTFGtkC61Vu9wynnsmq86ZfiNaSD5HRIeBY-D8HH0ufWIKUvipr9u6q34Cuum5uDtvYqSONjBU6xJp58tvrpWpLLw5JB5EIB-pnUHguLsa3B0oWmDYrsDcwFk3k65TFC0koh_SwOGFHbn7b8dmqEnZBdc9pnjc7MueRXcvdZgtQCiYmdXYIbIhHjLn8xEyLorz2LUPM2ijUqUp1-G4LgcXCzBpPiABkqWqGr91pGClCWMNu9WSwcnWTMTtsRVSDkxWQ2XN_z_qaDX4RVjnqby3v19pEEEvg8ZpMX7cSnSAltguAQVAg0wIWGEtXkYaN-KM2a48zQ";
            String qi = "lEXGjXz4uigp5Y2wXUDdJkxYrAHriajasXY_g9mrON_DZ3sejya566t-VorG0x0_5duE0lkrpVPeL2ykgPwfEgc4_1nbOsGJ81ttOgHLQJrqABrcETDBOXGPIPSLgSBnzcyfQyklpgRIe6NacDnnijVyrqsxK62WfWS_kquMQSUitB9p7oH_SVOnMVvmVaN7PsjnHFdxQrA4oROuPxzLvdTc5bD9p_ZUtP9P2OZsUCL3Y0kZTdLhoCOYAzv0Yd7OqjybSPZxudNCMlCL6P4k-tu5zL3qLPNOHi4uaq1nsjY2GlFLDhb-LXkBYbHz1VB1z04K9HmZOVXHE3Wn1YI4DQ";
    
            // 将 JWK 参数转换为 BigInteger
            BigInteger modulus = new BigInteger(1, Base64.getUrlDecoder().decode(n));
            BigInteger publicExponent = new BigInteger(1, Base64.getUrlDecoder().decode(e));
            BigInteger privateExponent = new BigInteger(1, Base64.getUrlDecoder().decode(d));
            BigInteger primeP = new BigInteger(1, Base64.getUrlDecoder().decode(p));
            BigInteger primeQ = new BigInteger(1, Base64.getUrlDecoder().decode(q));
            BigInteger primeExponentP = new BigInteger(1, Base64.getUrlDecoder().decode(dp));
            BigInteger primeExponentQ = new BigInteger(1, Base64.getUrlDecoder().decode(dq));
            BigInteger crtCoefficient = new BigInteger(1, Base64.getUrlDecoder().decode(qi));
    
            // 使用 JWK 参数生成 RSA 私钥
            RSAPrivateCrtKeySpec privateKeySpec = new RSAPrivateCrtKeySpec(
                    modulus, publicExponent, privateExponent, primeP, primeQ, primeExponentP, primeExponentQ, crtCoefficient);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
    
            // 你的 JWT 载荷
            String subject = "1234567890";
            String name = "John Doe";
            boolean admin = true;
    
            // 你的 JWT 选项
            String issuer = "sign@app1.example.com";
            String audience = "sign@app1.example.com";
            long expirationTime = 3600000L; // 1 小时的毫秒数
    
            // 使用 RSA 私钥签名 JWT
            String jws = Jwts.builder()
                    .setSubject(subject)
                    .claim("name", name)
                    .claim("admin", admin)
                    .setIssuer(issuer)
                    .setAudience(audience)
                    .setExpiration(new Date(System.currentTimeMillis() + expirationTime))
                    .signWith(SignatureAlgorithm.RS256, privateKey)
                    .compact();
    
            System.out.println(jws);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    }
    
    
    java
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-17/mZbrSpJOa0dDBvQtVX38ok4ihxHy.png)
复制代码
    public class JwtExample {
    public static void main(String[] args) throws Exception {
        String kty = "RSA";
        String kid = "sign@app1.example.com";
        String use = "sig";
        // 模数n的值
        BigInteger n = new BigInteger(1, Base64.getUrlDecoder().decode("yZw_hTRCpeKYeUkRdbAstk2z3WLto1kZrnLicg7dFgZHhoWbt9Qqej9wraZvE-8S85psNWiidQFGi_B99Ker-Pq3nKoz5ltJgdlN7YtwEeNhRzt4UYl_2tRZKUCujCD9l2UB7GbPGsfLjci9CQnEDjiUyAb2ahXxJl5AXMt111xdRxgUo3SQcC8E-_1Lizn3uPixz2CsH9Tj6HYf3-pd2aPQUD1d-G-S0vy-XLqRH7kvp9-loQBURNjvhD-TFAGp8-RfttvleAnyPfYJhlIORXhitHMM6bO1BUY5rfbxS4Fcb2NE3eaRqLFo3Jz9xr51YNdnEv3K2-KRKCfDlWSEfmCiK8MG4pILBYirxLlo16Xej6MpvrcE5v_dwG_fUmdl5pXMhGSrUyoi4daQZuCvQ_fOA3BzWvCCvrzRHxjZ1-O0A2yie-cqypjCsAZL1SONTsP8ZaO-0s_m9B4Sha547bFoo65fJcN3xWmlG5_bi48b10GOnfBCVusGNSq0T65BSSqJ582ZrpXr1fkI7ed0nAbTXm308PvCf-kVgd-MIH8xVkaiHOUnsabTt06q7wyF48g1z-wcq1K0GXokkVBqc26KVs_wwvcRyTPx3MxUPNhRxkWBoQhsgBPzwYdVg6lkCanuorBsfmRUrzGGRH0Ciz3iEQgIWm1QvvX-EDyyoTU"));
        // 公钥指数e的值
        BigInteger e = new BigInteger(1, Base64.getUrlDecoder().decode("AQAB"));
        // 私钥指数d的值
        BigInteger d = new BigInteger(1, Base64.getUrlDecoder().decode("CZOTbNdbpxeJWJGA888ngI1WUtjFIvIzhxbL7NEJ7Wbk9N3Z1LSOQ_pJduYl9pNvmgSmyS6sMNSbrkABK6LfR1dZa2amSnXhmvpgej0aWK8tSr3nbDAU06csiQoagGt8wDk7CyijA8mjwJtdZ1WAa5CCeLHj-IwMRV9KvV2ovk8T2zGooU8DIWEKYpHYicd6Hd4qTAhyhJyPKtaZkwBF7vWaCoWvtgJOvhjlTfBKvnAEdHvqGSiz2AVZ8zU13khp8zzQ0xXE45vNVuYd87RoGyKpxZqFbYBsw9BfIwVM1uJRKrVTaxrtpk6vBXOrlkortyrkKYHGpgUwEfE5mBoLNQPfirS4nosJsrGW9OXT74dZVKJaArUjhYvKtm68Evm_VhOH0LloXiUgf7YKW38vLgKrMJgTEj0_WJhDTYudUXb8-D2wy_deuDRtT19T0LxVp6v0-cpA52N2aTxoLir4CQcwI9pfLRLlcE_l3RbaaKKJrCE5g_KhtqYDFx_c2mHeM751mLOabON6I8uwSpFVcTM_D8Uq2gINiHKAX7Spb9bwyz9Lc7jaGebrWQNp61IZ5SWw4n2djJoTS0zEjyN2cQfSqKQ1fDzjwfFFE1AeplBoBiLzUFJNhKqfrpdx1CspoCOgAp3QAcwXqFicEkMrJcZGnJWM1DadbkwVWuDFBQ0"));
        // 第一个素数因子p
        BigInteger p = new BigInteger(1, Base64.getUrlDecoder().decode("-vEPNxnAAycIXBWhXHz2c0VqoArskmXodHaCsaZaXLD_6wBw1_Oxzj5SL_PlRgTGlt8gh-j_nKN_Rr09AsNHNVk_m6IBigIntegerM3epwNFMR-hA9fQC25ekcvJNlF21EEG3vTi90HzE5I9Htun4j9HZk00DorV5hJtj8ACf-k7tOkmKc7N7M9Ym7PS0bjUz1ZvbTACge_0NFs_G79ilowYdsiLl_8Mq540RN6dhyREfWgIJGlxU5hqud4fExfccIuKLAbZ-djkMN4eg-72oZ1eNkli3FExhQ1GnWXDn5t_brem7jWWaqrMOKI6gI2WX_GwhA0qZiBDg9YyVC--dj4GPJipR6mw"));
        // 第二个素数因子q
        BigInteger q = new BigInteger(1, Base64.getUrlDecoder().decode("zayfhs0KktFs_b2nSXH6F3jTyhP1_E6C6xq-UrLdvbVTo_sDFYzSfspCTgmr1CzmUu_E8-qhCZCkucQhVReLo7XdAizzliWpU54Y2wpT9UyH8hZuOB1lTWu7f8CAE_SbmTFTzVMfr_QvnaDGsawHtQ-PW_OfyaT4uSy1gQxadQWXNU03PQbO6MsD8jJ8IxVYtPoD0eRasZc9eTrX_QJyeSHDm3nZe5ym1fwish85Bw_aZeKqjmbVD-XMP5YNvRSkg0ua7gXY8tmIodE8_Fdx2EZ9VqiBGmgQF7QKLW6C9HptRwD4qC7SdgHQDjv9UEcyEme4fjPIygI9RdJIKm_obw"));
        // d mod (p - 1)
        BigInteger dp = new BigInteger(1, Base64.getUrlDecoder().decode("cX_ai-d_q21aIJw_8Z8rsRNymJSYT9b7_sEjd8pwEICWH-qBH4u_njMd5UaBKtw6Hj8pbY97HZPtm0c4cylz6bNGS9RN0YmZ2nDALsRtqz5Je0-mibx4-tGW-X9fv5NDCGCxIXxv8-vdw1JRZCN1mgSYGIQH5uIwCQ2tChTEOXbEaUI0iAUA8zYdwMZexTFgY8A_pJXvl_U-xlnEQ0rzjSuETEC2pNAbTrrXUCScXPVioYC51lnLMsJ1NV2Xf320O4Ykn0r2PD9XFCDXe_2Tp4FV_d0o8Wnfgs-RzjydY_BFvgJrVplH91xkuAtRlnVe2928Fj3iQCF2USWRILbrhQ"));
        // d mod (q - 1)
        BigInteger dq = new BigInteger(1, Base64.getUrlDecoder().decode("vwpa21FVQu54OHCTFGtkC61Vu9wynnsmq86ZfiNaSD5HRIeBY-D8HH0ufWIKUvipr9u6q34Cuum5uDtvYqSONjBU6xJp58tvrpWpLLw5JB5EIB-pnUHguLsa3B0oWmDYrsDcwFk3k65TFC0koh_SwOGFHbn7b8dmqEnZBdc9pnjc7MueRXcvdZgtQCiYmdXYIbIhHjLn8xEyLorz2LUPM2ijUqUp1-G4LgcXCzBpPiABkqWqGr91pGClCWMNu9WSwcnWTMTtsRVSDkxWQ2XN_z_qaDX4RVjnqby3v19pEEEvg8ZpMX7cSnSAltguAQVAg0wIWGEtXkYaN-KM2a48zQ"));
        // q^-1 mod p
        BigInteger qi = new BigInteger(1, Base64.getUrlDecoder().decode("lEXGjXz4uigp5Y2wXUDdJkxYrAHriajasXY_g9mrON_DZ3sejya566t-VorG0x0_5duE0lkrpVPeL2ykgPwfEgc4_1nbOsGJ81ttOgHLQJrqABrcETDBOXGPIPSLgSBnzcyfQyklpgRIe6NacDnnijVyrqsxK62WfWS_kquMQSUitB9p7oH_SVOnMVvmVaN7PsjnHFdxQrA4oROuPxzLvdTc5bD9p_ZUtP9P2OZsUCL3Y0kZTdLhoCOYAzv0Yd7OqjybSPZxudNCMlCL6P4k-tu5zL3qLPNOHi4uaq1nsjY2GlFLDhb-LXkBYbHz1VB1z04K9HmZOVXHE3Wn1YI4DQ"));
    
        // 构建RSA私钥
        RSAPrivateCrtKeySpec privateKeySpec = new RSAPrivateCrtKeySpec(n, e, d, p, q, dp, dq, qi);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PrivateKey rsaPrivateKey = kf.generatePrivate(privateKeySpec);
    
        String jwtSecret = "This is used for the HMAC algorithm, but you don't need it here since you're using RSA"; // 对于RSA,此处无需设置
    
        // 构造要放入JWT的claims
        Map<String, Object> claims = new HashMap<>();
        claims.put("sub", "subject_identifier");
        claims.put("exp", System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(30)); // 有效期30分钟
    
        // 创建并签名JWT
        String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.RS256, rsaPrivateKey) // 使用RSA和SHA-256算法签名
                .compact();
    
        System.out.println(token);
    }
    }
    
    
    java
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-17/h2Aj1f9sObnXFgmPGiovxTC5N3wL.png)

全部评论 (0)

还没有任何评论哟~