Regex jeton d'accès npm (npm_…)
Depuis septembre 2021, un jeton d'accès npm commence par « npm_ » (le tiret bas remplace le tiret pour qu'un double-clic sélectionne tout le jeton) et ses 6 derniers caractères sont une somme de contrôle CRC32 encodée en Base62 ; l'entropie passe de 128 à 178 bits (annonce de GitHub, propriétaire de npm). Les anciens jetons étaient des UUID de 36 caractères. La longueur du nouveau format n'est pas indiquée dans l'annonce : les trois détecteurs relus retiennent 36 caractères après le préfixe. Ils divergent sur le reste : gitleaks ignore la casse, secretlint accepte le tiret bas dans le corps, trufflehog accepte un corps de 40 caractères, et tous trois acceptent un jeton suivi d'un espace. Voici un motif ancré, comparé à ces outils.
/^npm_[A-Za-z0-9]{36}$/passe 21/21 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| gitleaks (npm-access-token) — insensible à la casse : « NPM_… » passe ; conçu pour détecter dans du texte : un jeton suivi d'un espace, ou une ligne .npmrc, passe | \b(npm_[a-z0-9]{36})(?:[\x60'"\s;]|\\[nr]|$) | 18 / 21 | sûr |
| trufflehog (npmtokenv2) — aucune ancre : « xnpm_… » et un corps de 40 caractères passent | (npm_[0-9a-zA-Z]{36}) | 16 / 21 | sûr |
| secretlint (règle npm) — bornes par assertions, mais le tiret bas est accepté dans le corps, que Base62 exclut | (?<!\p{L})npm_[A-Za-z0-9_]{36}(?![A-Za-z0-9_]) | 18 / 21 | indéterminé |
Implémentation
const re = new RegExp("^npm_[A-Za-z0-9]{36}$", "");
re.test(input);Limites
- Valide seulement la FORME : ne vérifie ni la somme de contrôle CRC32 des 6 derniers caractères, ni que le jeton existe ou est actif.
- La longueur de 36 caractères après le préfixe n'est pas écrite dans l'annonce de GitHub : elle vient des détecteurs et d'un recoupement avec l'entropie annoncée. Les anciens jetons UUID (8-4-4-4-12 hexadécimaux), encore possibles dans de vieux fichiers, sont rejetés.
- Un fichier .npmrc contient le jeton après « _authToken= » : extrayez-le avant de valider (la ligne entière est rejetée). Ne collez jamais un vrai jeton dans un outil en ligne.