Zum Inhalt springen
ecdsa.com
PyJWT (Python)JWT-Bibliotheken

Fehlermeldung

Invalid crypto padding

Auch ausgegeben als

  • Invalid header padding
  • Invalid payload padding
  • jwt.exceptions.DecodeError: Invalid crypto padding

Das Wort vor „padding“ nennt das Segment: `header`, `payload` oder `crypto` (die Signatur).

PyJWT (Python) — jwt.exceptions.DecodeError while base64url-decoding a segment

Was der Fehler bedeutet

PyJWT hat das Token in drei Segmente zerlegt, konnte eines davon aber nicht als base64url dekodieren. „crypto padding“ bezieht sich auf das dritte Segment (die Signatur), „header padding“ und „payload padding“ auf das erste und das zweite. JWS-Segmente müssen das URL-sichere base64-Alphabet (`A–Z a–z 0–9 - _`) ohne Padding mit `=` verwenden; Leerzeichen, `+`, `/` oder eine falsche Länge lassen die Dekodierung noch vor jeder Signaturprüfung scheitern.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Schema entfernen und Alphabet prüfen

    Akzeptiere nur `Bearer <token>`, wenn das Token dem base64url-Muster eines JWS entspricht; beantworte alles andere mit 401, noch bevor du PyJWT aufrufst.

    python
    import re
    
    BASE64URL_JWS = re.compile(r"^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*$")
    
    def extract(authorization: str) -> str:
        scheme, _, token = authorization.partition(" ")
        token = token.strip()
        if scheme.lower() != "bearer" or not BASE64URL_JWS.match(token):
            raise ValueError("not a compact JWS")
        return token
  2. 2.

    Mit base64url ohne Padding kodieren

    Wenn du Tokens selbst baust, verwende URL-sicheres base64 und entferne abschließende `=`. Besser: Lass eine JOSE-Bibliothek das Token zusammensetzen.

    python
    import base64
    
    def b64url(data: bytes) -> str:
        # JWS uses base64url WITHOUT padding (RFC 7515 section 2).
        return base64.urlsafe_b64encode(data).rstrip(b"=").decode("ascii")

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen