Saltar al contenido
ecdsa.com
PyJWT (Python)Bibliotecas de JWT

Mensaje de error

Invalid crypto padding

También se muestra como

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

La palabra que precede a «padding» indica el segmento: `header`, `payload` o `crypto` (la firma).

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

Qué significa

PyJWT dividió el token en tres segmentos, pero no pudo decodificar en base64url uno de ellos. La expresión «crypto padding» se refiere al tercer segmento (el de la firma), y «header padding» y «payload padding», al primero y al segundo. Los segmentos JWS deben usar el alfabeto base64 seguro para URL (`A–Z a–z 0–9 - _`) sin relleno `=`; los espacios, `+`, `/` o una longitud incorrecta hacen que la decodificación falle antes de cualquier comprobación de la firma.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Quitar el esquema y validar el alfabeto

    Acepta solo `Bearer <token>` cuando el token coincida con el patrón JWS en base64url; responde 401 a todo lo demás antes de llamar a PyJWT.

    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.

    Codificar con base64url y sin relleno

    Si construyes los tokens tú mismo, usa base64 seguro para URL y elimina los `=` finales. Mejor aún: deja que una biblioteca JOSE ensamble el token.

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

Errores relacionados

Explorar toda la base de datos de errores de firma