我正在尝试使用JWT验证令牌的签名。 但是我在KeyFactory.generatePublic上收到错误 “解析公钥时出错”。 我首先尝试很好地解码json,因为我收到错误“非法的base64字符”或“无效的密钥格式” 谁能帮助我,以了解我做错了什么? 谢谢
fun testSign(token: String)
{
var kf = KeyFactory.getInstance("RSA")
var publicKeyB64 = "{\"kid\":\"1\",\"e\":\"AQAB\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"rXYc2Ehtb42R83kLIw56biI/ABOp03lzbYHdXI0caeliqP7KPOvaKQjQsCl84qmA7CIRTve4sBUq1Fp/zwMeyxMV5tvLIX2WIexf0OarA5S1ibU9xCD6LWzkdy1nhXeeDCeaN3fn3/7cdQIijII5YBKt0jTdqj9Sc48dguwObWkDbqFTYHf5DNn1qXDpvTCMON696eXJu+wzu3O+U8JBIR0XJyn2tcnrprkE5V+XCBGcLtG6W86r9m/aJptuCEP3L+nVx7CCPd0y/g9QgbtGTJT2CvgRlAzmVmbg9WgKHA4ZIXprvnGgXdu+gSNUB2JiQ3lqRxJgPkXlUb4M0EGH4Q==\",\"use\":\"sig\"}"
publicKeyB64 = publicKeyB64.replace('-', '+').replace('_', '/')
publicKeyB64 = String(
Base64.getEncoder()
.encode(publicKeyB64.toByteArray(StandardCharsets.UTF_8))
)
val decoded = Base64.getDecoder().decode(publicKeyB64)
val spec = X509EncodedKeySpec(decoded)
val publicKey = kf.generatePublic(spec) as RSAPublicKey
print(publicKey)
try {
var algorithm: Algorithm = Algorithm.RSA256(publicKey, null);
var verifier: JWTVerifier = com.auth0.jwt.JWT.require(algorithm)
.withIssuer("auth0")
.build(); //Reusable verifier instance
var jwtDecodedJWT = verifier.verify(token);
} catch (exception: JWTVerificationException) {
//Invalid signature/claims
print(exception)
}
}
我也尝试了另一种类型的密钥,但是当我尝试创建公共密钥时,总是会遇到相同类型的错误
var publicKeyB64 = "MIICXAIBAAKBgQCUibP4fY2PA/sGMKMbU6usuIGcOAqgQjD6c2ylVo05Oz7pgjnE+O0l2MFRUYUGT5KKk/W+0cAXkxaQHE3n8A8X1mHT8eMDmWnzz0PeYjDE8LQmAw8RY2FnVKFAB36BIjdb5FsZmCk5QYKU5+nWLMqH/j/IR5AyX5wR2SMoslUg2QIDAQABAoGAeJ1s7638IhLIZtldyRXjRKi6ToFPV50IKodJxOSIXt3WE0V05ZaA84eUSxUYIOzCgRbuqVmnUz1USAdD18AecC8qc7tXTRALLy7q8fxklPwmGPUOvTFmI7gRMUnvcWrq1gySk3SKpj0YmWnuY9Xmd2+xoWLzUeFD1CROY5OTjIECQQDDlp1+Al7+duR0XyMlkWLIk0nIbkQ5zlTAEipzmaeTSOJi6YG3EMMz3AGuZb7tw6HFxWqeg1hyKJ+TcTM3WTdJAkEAwmrCDKE29n3wFOBKsZZFQbDgVOUXCBs2ubEI+ALe1DJU5BlfnrhJOINRCNgnwSFNbwxDTkDpR6J6Av2ElAvNEQJAV0dVvk5Wj50Ecz2lFHWdLD41taAnB9igDxnMIcvWcK4cf+ENhmCPiwvJIEa8/aLIBNYErvmTtVWVaBkirrc8KQJABr+z+sJB6S6X/fGHRkDkKJKeRvQo54QiUzHdENbwq0cQAVcMJbNZ/1c3oen2/1JLoNY5I+dG8dCnEaGBT65VMQJBAIDqH1Kqs5tb51cpt6h9ot31SUVud5pSML/babwp3pRs1s6poreym4PkAyRug0Dgcj1zVLt25TlOHvrL9r3Swq8="
我在这里出错
val publicKey = kf.generatePublic(spec) as RSAPublicKey
java.security.spec.InvalidKeySpecException:com.android.org.conscrypt.OpenSSLX509CertificateFactory $ ParsingException:解析公共密钥时出错
我在做什么错? 我看到我在网上看到很多脚本,它们执行相同的操作
谢谢
答案 0 :(得分:1)
您的第二把钥匙似乎不正确。
如果需要,可以根据第一个示例中出现的RSAPublicKey
和n
值创建一个e
。您将需要从提供的json中提取这些值,并按以下步骤进行操作:
var e = "AQAB";
var n = "rXYc2Ehtb42R83kLIw56biI/ABOp03lzbYHdXI0caeliqP7KPOvaKQjQsCl84qmA7CIRTve4sBUq1Fp/zwMeyxMV5tvLIX2WIexf0OarA5S1ibU9xCD6LWzkdy1nhXeeDCeaN3fn3/7cdQIijII5YBKt0jTdqj9Sc48dguwObWkDbqFTYHf5DNn1qXDpvTCMON696eXJu+wzu3O+U8JBIR0XJyn2tcnrprkE5V+XCBGcLtG6W86r9m/aJptuCEP3L+nVx7CCPd0y/g9QgbtGTJT2CvgRlAzmVmbg9WgKHA4ZIXprvnGgXdu+gSNUB2JiQ3lqRxJgPkXlUb4M0EGH4Q==";
var eInt = BigInteger(1, Base64.getDecoder().decode(e))
var nInt = BigInteger(1, Base64.getDecoder().decode(n))
var spec = RSAPublicKeySpec(nInt, eInt)
val publicKey = kf.generatePublic(spec) as RSAPublicKey
print(publicKey)
它将打印您的公共密钥。