gpt4 book ai didi

java - RSA key 对不起作用

转载 作者:行者123 更新时间:2023-12-02 11:05:51 27 4
gpt4 key购买 nike

这是我的 key 生成:

KeyPairGenerator keyGen = null;
try {
keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String publicKey= Base64.getEncoder().encodeToString(keyGen.genKeyPair().getPublic().getEncoded());
String privateKey = Base64.getEncoder().encodeToString(keyGen.genKeyPair().getPrivate().getEncoded());}

这是我的签名 token 生成代码

private String generateRSASignedToken(JWTClaimsSet claimsSet) {
SignedJWT signedJwt = new SignedJWT(new JWSHeader(JWSAlgorithm.RS256), claimsSet);

RSASSASigner signer = new RSASSASigner(getPrivateKey());
String token= null;
try {
signedJwt.sign(signer);
token = signedJwt.serialize();

} catch (JOSEException e) {
e.printStackTrace();
}
return token;
}

获取公钥和私钥

private  RSAPrivateKey getPrivateKey() {
java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
try(InputStream stream = getClass().getClassLoader().getResourceAsStream("private.key")){
String privatekey = IOUtils.toString(stream, Charset.defaultCharset().toString());
System.out.println("after: "+privatekey);
byte[] key = Base64.getDecoder().decode(privatekey);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(key);
KeyFactory kf = KeyFactory.getInstance("RSA");
return (RSAPrivateKey) kf.generatePrivate(spec);}
catch (Exception e) {
e.printStackTrace();
return null;
}
}


private RSAPublicKey getPublicKey(){
try(InputStream stream = getClass().getClassLoader().getResourceAsStream("public.key")){
String publickey = IOUtils.toString(stream, Charset.defaultCharset().toString());
System.out.println("after: "+publickey);
byte[] key = Base64.getDecoder().decode(publickey);
X509EncodedKeySpec spec = new X509EncodedKeySpec(key);
KeyFactory kf = KeyFactory.getInstance("RSA");
return (RSAPublicKey) kf.generatePublic(spec);}
catch (Exception e) {
e.printStackTrace();
return null;
}}

token 验证:

String token = generateRSASignedToken(claimsSet);
JWSVerifier verifier = new RSASSAVerifier(getPublicKey());
SignedJWT jwt=null;
try {
jwt = SignedJWT.parse(token);
System.out.println(jwt.verify(verifier));
} catch (ParseException | JOSEException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

从 token 生成部分到获取公钥和私钥,一切看起来都很好,但验证部分不起作用。生成的 key 对打印 false。它与我从在线工具获得的 key 对(由于许可问题而无法使用)一起工作正常,但在我生成 key 时却无法正常工作。

最佳答案

问题出在这里:

String publicKey  = Base64.getEncoder().encodeToString(keyGen.genKeyPair().getPublic().getEncoded());
String privateKey = Base64.getEncoder().encodeToString(keyGen.genKeyPair().getPrivate().getEncoded());

每次调用genKeyPair()时都会生成一个新的 key 对。因此,publicKeyprivateKey 来自不同且不相关的 key 对。解决方案很简单,保存刚刚生成的 key 对,例如

KeyPair kp = keyGen.genKeyPair();
String publicKey = Base64.getEncoder().encodeToString(kp.getPublic().getEncoded());
String privateKey = Base64.getEncoder().encodeToString(kp.getPrivate().getEncoded());

注意:代码可能还有其他问题,这是我发现的第一个问题。

关于java - RSA key 对不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50965042/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com