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
Un secret HMAC court, choisi par un humain
fréquenteDes valeurs comme `secret`, `change-me-please` ou le nom d’une application font bien moins de 32 octets et sont, de surcroît, souvent devinables.
Mise à niveau de php-jwt de 6.x vers 7.x
fréquenteLa version 7 a ajouté les contrôles de taille de clé minimale. Du code et des secrets qui fonctionnaient depuis des années échouent dès la première requête après `composer update`.
Une clé RSA de 1024 bits
occasionnelleLes anciennes clés générées en 1024 bits (ou copiées depuis des exemples) sont refusées pour RS256/RS384/RS512.
Comment corriger l’erreur
- 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.
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.
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