Aller au contenu
ecdsa.com
firebase/php-jwt 7.x (PHP)PHP

Message d’erreur

Provided key is too short

Également affiché sous la forme

  • DomainException: Provided key is too short

Cette erreur est levée par `JWT::encode` comme par `JWT::decode`. php-jwt 6.x et les versions antérieures acceptaient les clés courtes, si bien que l’erreur apparaît généralement juste après la mise à niveau vers 7.x.

firebase/php-jwt 7.x (PHP) — DomainException from JWT::encode / JWT::decode

Ce que cela signifie

php-jwt 7 contrôle les tailles de clé avant de signer ou de vérifier : un secret HMAC doit compter au moins autant de bits que le condensat (32 octets pour HS256, 48 pour HS384, 64 pour HS512), une clé RSA au moins 2048 bits, et une clé EC au moins la taille qu’implique son algorithme. Une clé plus courte est refusée, car les jetons qu’elle protège peuvent être falsifiés : les secrets HMAC courts cèdent à une attaque par force brute hors ligne, et RSA 1024 bits est en dessous des minimums actuels.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Générer un nouveau secret aléatoire

    Utilisez `random_bytes` ou `openssl rand` et conservez le secret dans un gestionnaire de secrets. Sa rotation invalide les jetons existants : prévoyez donc une courte période de chevauchement si nécessaire.

    bash
    # HS256 needs >= 32 bytes, HS512 >= 64; generate and store as base64
    php -r 'echo base64_encode(random_bytes(64)), PHP_EOL;'
  2. 2.

    Le stocker encodé en base64 et utiliser les octets décodés

    Validez la longueur une fois au démarrage, pour qu’un secret faible fasse échouer le déploiement plutôt que la première requête.

    php
    $secret = base64_decode(getenv('JWT_SECRET_B64'), true);
    if ($secret === false || strlen($secret) < 32) {
        throw new RuntimeException('JWT_SECRET_B64 must decode to at least 32 bytes');
    }
    $token = JWT::encode($claims, $secret, 'HS256');
    $decoded = JWT::decode($token, new Key($secret, 'HS256'));
  3. 3.

    Remplacer les clés RSA de petite taille

    Générez une clé RSA de 2048 bits ou plus (ou passez à ES256 avec une clé P-256) et publiez la nouvelle clé publique avant de l’utiliser pour signer.

    bash
    openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out rs256-private.pem

Erreurs associées

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