每次调用都会RsaJwkGenerator.generateJwk(...)
生成一个新的公钥/私钥对。使用私钥签名的 JWT 上的签名只能使用相应的公钥进行验证(这是安全性的重要组成部分)。底线是需要为给定的上下文使用适当的密钥,这表明在您的应用程序中访问密钥的不同方式。
因此,对于需要相同键的某些类的不同实例,键的某种单例可能是合适的。
为了在应用程序重新启动后继续存在,密钥需要以某种方式持久化和加载。使用 java 的 Keystore 是您可以做到这一点的一种方法。或者整个 JWK 的 JSON 可以作为字符串访问rsaJsonWebKey.toJson(JsonWebKey.OutputControlLevel.INCLUDE_PRIVATE)
并保存在某处。不过,您确实要小心使用私钥,因此请将其保存在安全的地方和/或也许您可以使用 JWE 对整个内容进行加密 - 其中一些使用基于密码的加密的代码如下所示:
String jwkjson = rsaJsonWebKey.toJson(JsonWebKey.OutputControlLevel.INCLUDE_PRIVATE);
JsonWebEncryption encryptingJwe = new JsonWebEncryption();
encryptingJwe.setAlgorithmHeaderValue(KeyManagementAlgorithmIdentifiers.PBES2_HS256_A128KW);
encryptingJwe.setEncryptionMethodHeaderParameter(ContentEncryptionAlgorithmIdentifiers.AES_128_CBC_HMAC_SHA_256);
encryptingJwe.setKey(new PbkdfKey("some decent passphrase/password here"));
encryptingJwe.setPayload(jwkjson);
String jweEncryptedJwk = encryptingJwe.getCompactSerialization();
// save jweEncryptedJwk somewhere and load it on application start
JsonWebEncryption decryptingJwe = new JsonWebEncryption();
decryptingJwe.setCompactSerialization(jweEncryptedJwk);
encryptingJwe.setKey(new PbkdfKey("some decent passphrase/password here"));
String payload = encryptingJwe.getPayload();
PublicJsonWebKey publicJsonWebKey = PublicJsonWebKey.Factory.newPublicJwk(payload);
// share the public part with whomever/whatever needs to verify the signatures
System.out.println(publicJsonWebKey.toJson(JsonWebKey.OutputControlLevel.PUBLIC_ONLY));