nimbus-jose-jwt库简单使用 & 公私钥字符串互相转换


maven坐标

<dependency>
   <groupId>com.nimbusds</groupId>
   <artifactId>nimbus-jose-jwt</artifactId>
   <version>9.37.3</version>
</dependency>

对称密钥签名

密钥长度有限制。需大于等于 对应算法所需的密钥长度。
256 / 8
354 / 8
512 / 8

String macKey = "d^d&4mpSz^Pd@JyKYQR=AZhm7PQzQKgsSY*";
        JWSSigner signer = new MACSigner(macKey);
        JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
                .subject("zs")
                .claim("role", "admin")
                .build();
        SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.HS256), claimsSet);
        signedJWT.sign(signer);
        String jwtString = signedJWT.serialize();
        System.out.println("Generated JWT: " + jwtString);
        JWSVerifier verifier = new MACVerifier(macKey);
        SignedJWT parsedJWT = SignedJWT.parse(jwtString);
        if (parsedJWT.verify(verifier)) {
            System.out.println("JWT verification successful.");
            System.out.println("Subject: " + parsedJWT.getJWTClaimsSet().getSubject());
            System.out.println("Role: " + parsedJWT.getJWTClaimsSet().getClaim("role"));
        } else {
            System.out.println("JWT verification failed.");
        }

非对称密钥对

包括生成RSA密钥对

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();

RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

JWSSigner signer = new RSASSASigner(privateKey);
JWSVerifier verifier = new RSASSAVerifier(publicKey);
// 测试生效时间,到了哪个时刻才能使用
Date date = Date.from(LocalDateTime.now().plusYears(1).atZone(ZoneId.of("Asia/Shanghai"))
        .toInstant());
JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
        .subject("zs")
        .claim("role", "admin")
        .notBeforeTime(date)
        .build();

SignedJWT signedJWT = new SignedJWT(new JWSHeader.Builder(JWSAlgorithm.RS256).keyID("kid").build(), claimsSet);
signedJWT.sign(signer);

String jwtString = signedJWT.serialize();
System.out.println("Generated JWT: " + jwtString);

// Verify the JWT token
SignedJWT parsedJWT = SignedJWT.parse(jwtString);

if (parsedJWT.verify(verifier)) {
    // 校验通过后,可以取出生效时间与当前时刻比较,判断是否可以使用
    Date notBeforeTime = parsedJWT.getJWTClaimsSet().getNotBeforeTime();
    System.out.println("JWT verification successful.");
    System.out.println("Subject: " + parsedJWT.getJWTClaimsSet().getSubject());
    System.out.println("Role: " + parsedJWT.getJWTClaimsSet().getClaim("role"));
} else {
    System.out.println("JWT verification failed.");
}

公私钥与字符串互相转换

生成密钥对

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();

RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

公私钥转字符串

Base64.getEncoder().encodeToString(key.getEncoded());

字符串转公私钥

公钥字符串转公钥对象

byte[] keyBytes = Base64.getDecoder().decode(keyString);
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(spec);

私钥字符串转私钥对象

byte[] keyBytes = Base64.getDecoder().decode(keyString);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(spec);
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将一个 JWK 转换为 X509Certificate 是不可能的,因为它们是不同的密钥格式。JWK 是 JSON Web Key 的缩写,它是一种用于表示密钥的 JSON 格式。而 X509Certificate 是一种常用的钥证书格式,用于证明钥的合法性和身份。 如果你需要将 JWK 转换为 X509Certificate,你需要先将 JWK 转换为一个 Java 的密钥对象,然后再使用 Java 的密钥工具将其转换为 X509Certificate,具体实现步骤如下: 1.使用 Nimbus JOSE+JWT 将 JWK 转换为 Java 的密钥对象: ```java import com.nimbusds.jose.jwk.JWK; import com.nimbusds.jose.jwk.RSAKey; import java.security.interfaces.RSAPublicKey; JWK jwk = JWK.parse(jwkJsonString); RSAKey rsaJWK = (RSAKey) jwk; RSAPublicKey publicKey = rsaJWK.toRSAPublicKey(); ``` 2.使用 Java 的密钥工具将密钥对象转换为 X509Certificate: ```java import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateEncodingException; import java.security.cert.Certificate; public static X509Certificate getCertificateFromPublicKey(RSAPublicKey publicKey) throws CertificateEncodingException, CertificateException { CertificateFactory cf = CertificateFactory.getInstance("X.509"); byte[] certBytes = publicKey.getEncoded(); Certificate cert = cf.generateCertificate(new ByteArrayInputStream(certBytes)); return (X509Certificate) cert; } ``` 请注意,这里的代码示例仅为示范代码,实际使用时需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值