根据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

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

全部评论 (0)
还没有任何评论哟~
