Zum Inhalt springen
ecdsa.com
Java (JDK)Java

Fehlermeldung

java.lang.IllegalArgumentException: Illegal base64 character 2d

Auch ausgegeben als

  • 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

Der Hexwert bezeichnet das störende Zeichen: `2d` „-“, `5f` „_“, `a` LF, `d` CR, `20` Leerzeichen.

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

Was der Fehler bedeutet

`Base64.getDecoder()` ist der strikte Decoder nach RFC 4648: Er akzeptiert nur `A–Z a–z 0–9 + /` sowie `=` als Padding und bricht beim ersten anderen Zeichen ab. Die Hexzahl ist der Code dieses Zeichens: `2d` ist `-` (die Bindestriche von `-----BEGIN …-----` oder aus dem base64url-Alphabet), `a` ist ein Zeilenvorschub, `d` ein Wagenrücklauf, `20` ein Leerzeichen, `5f` ein Unterstrich. Die Daten selbst sind meist in Ordnung – sie stecken nur in einer anderen Textverpackung, als der Decoder erwartet.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Rahmenzeilen entfernen und MIME-Decoder verwenden

    `Base64.getMimeDecoder()` überspringt Zeilentrenner – genau das, was der Inhalt von PEM-Blöcken braucht.

    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.

    URL-Decoder für JOSE-Daten verwenden

    Alles in einem JWT und in einem JWK ist base64url; der URL-Decoder akzeptiert auch das fehlende Padding.

    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"));

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen