Aller au contenu
ecdsa.com
Java (JDK)Java

Message d’erreur

java.lang.IllegalArgumentException: Illegal base64 character 2d

Également affiché sous la forme

  • 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

La valeur hexadécimale désigne le caractère fautif : `2d` « - », `5f` « _ », `a` LF, `d` CR, `20` espace.

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

Ce que cela signifie

`Base64.getDecoder()` est le décodeur RFC 4648 strict : il n’accepte que `A–Z a–z 0–9 + /` et le remplissage `=`, et s’arrête au premier autre caractère. Le nombre hexadécimal est le code de ce caractère : `2d` est `-` (les tirets de `-----BEGIN …-----`, ou l’alphabet base64url), `a` un saut de ligne, `d` un retour chariot, `20` un espace, `5f` un trait de soulignement. Les données sont généralement correctes : elles sont simplement dans un autre habillage textuel que celui attendu par le décodeur.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Retirer l’armure et utiliser le décodeur MIME

    `Base64.getMimeDecoder()` ignore les séparateurs de ligne, ce qui est exactement ce dont les corps PEM ont besoin.

    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.

    Utiliser le décodeur URL pour les données JOSE

    Tout le contenu d’un JWT et d’une JWK est en base64url ; le décodeur URL accepte en outre l’absence de remplissage.

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

Erreurs associées

Parcourir toute la base de données des erreurs de signature