Saltar al contenido
ecdsa.com
Java (JDK)Java

Mensaje de error

java.lang.IllegalArgumentException: Illegal base64 character 2d

También se muestra como

  • java.lang.IllegalArgumentException: Illegal base64 character a
  • java.lang.IllegalArgumentException: Illegal base64 character d
  • java.lang.IllegalArgumentException: Illegal base64 character 5f
  • java.lang.IllegalArgumentException: Illegal base64 character 20

El valor hexadecimal identifica el carácter problemático: `2d` «-», `5f` «_», `a` LF, `d` CR, `20` espacio.

Java (JDK) — java.util.Base64.Decoder.decode

Qué significa

`Base64.getDecoder()` es el decodificador estricto del RFC 4648: solo acepta `A–Z a–z 0–9 + /` y el relleno `=`, y se detiene en el primer carácter distinto. El número hexadecimal es el código de ese carácter: `2d` es `-` (los guiones de `-----BEGIN …-----`, o el guion del alfabeto base64url), `a` es un salto de línea, `d` un retorno de carro, `20` un espacio y `5f` un guion bajo. Normalmente los datos están bien: solo vienen en un envoltorio textual distinto del que espera el decodificador.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Quitar los delimitadores y usar el decodificador MIME

    `Base64.getMimeDecoder()` omite los separadores de línea, que es justo lo que necesita el cuerpo de un PEM.

    java
    String body = pem.replaceAll("-----(BEGIN|END) [A-Z ]+-----", "");
    byte[] der = Base64.getMimeDecoder().decode(body); // ignores line separators and other non-alphabet characters
  2. 2.

    Usar el decodificador URL para datos JOSE

    Todo lo que hay en un JWT y en una JWK está en base64url; el decodificador URL acepta además la falta de relleno.

    java
    // JWT segments and JWK fields ("x", "y", "n", "e") use base64url without padding.
    byte[] header = Base64.getUrlDecoder().decode(jwt.split("\\.")[0]);
    byte[] x = Base64.getUrlDecoder().decode(jwk.get("x"));

Errores relacionados

Explorar toda la base de datos de errores de firma