Синтаксический анализ открытого ключа с помощью KeyFactory

#java #android-studio #kotlin #jwt

#java #android-studio #kotlin #jwt

Вопрос:

я пытаюсь проверить подпись токена с помощью 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: ошибка синтаксического анализа открытого ключа

что я делаю не так? Я вижу, что видел много сценариев в сети, которые делают то же самое

Спасибо

Ответ №1:

Ваш второй ключ кажется некорректным.

Если вы хотите, вы можете создать RSAPublicKey from 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)
  

который напечатает ваш открытый ключ.

Комментарии:

1. Второй ключ является закрытым ключом, а не открытым ключом, и хотя это ASN.1, это формат, зависящий от алгоритма, из PKCS1 , а не формат, используемый Java для privatekeys, который является PKCS8 . Он также 1024-битный, что больше не считается безопасным для RSA.

2. @michalk спасибо, мне удалось получить открытый ключ, но затем я получаю исключение, когда иду проверять pl.kotl.in/NKxMwJb79