Regex Stripe API key (sk_live_, pk_test_…)
A Stripe API key is written type_mode_body: the type is sk (secret), rk (restricted) or pk (publishable), the mode is test (sandbox) or live (production), and the body is alphanumeric. Stripe's documentation only fixes these prefixes (sk_live_, rk_test_, pk_live_…), not the body length; the bounds come from detectors, which vary: exactly 24 characters in detect-secrets, 20 to 247 in trufflehog, 10 to 99 in gitleaks. The three tools I read only look at secret or restricted keys, and two ignore test keys. Here's an anchored pattern covering the three types and both modes, compared against those tools.
/^(?:sk|rk|pk)_(?:test|live)_[A-Za-z0-9]{24,247}$/passes 24/24 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| gitleaks (stripe-access-token) — accepte le mode « prod » (absent de la documentation); ignore les clés publiables pk_ ; borne le corps à 99, donc refuse un corps de 107 caractères | \b((?:sk|rk)_(?:test|live|prod)_[a-zA-Z0-9]{10,99})(?:[\x60'"\s;]|\\[nr]|$) | 18 / 24 | safe |
| detect-secrets (Yelp, StripeDetector) — uniquement sk_live_ et rk_live_ : les clés de test et pk_ sont rejetées ; corps de 24 caractères exactement, sans ancre : un corps plus long passe | (?:r|s)k_live_[0-9a-zA-Z]{24} | 16 / 24 | safe |
| trufflehog (stripe) — uniquement live ; sans ancre : un corps de 248 caractères passe (le motif en prend 247), préfixe collé à du texte aussi | [rs]k_live_[a-zA-Z0-9]{20,247} | 14 / 24 | safe |
Implementation
const re = new RegExp("^(?:sk|rk|pk)_(?:test|live)_[A-Za-z0-9]{24,247}$", "");
re.test(input);Limits
- Valide seulement la FORME : ne prouve pas que la clé existe ni qu'elle est active (seule l'API de Stripe peut le dire). Une clé sk_live_ valide en forme mais inventée passe ce motif.
- La documentation de Stripe ne fixe ni la longueur ni l'alphabet du corps : la borne de 24 à 247 caractères alphanumériques est un choix inspiré de detect-secrets et de trufflehog, pas une règle publiée. Si Stripe change le format, adaptez-la.
- Les clés d'organisation (sk_org_…) et les clés gérées émises par des plateformes d'hébergement sont mentionnées par la documentation mais ne sont pas couvertes. Les secrets de webhook (whsec_…) et les identifiants d'objets (pi_…, cus_…) sont d'autres formats.
- Une clé pk_ est publiable (côté client) ; sk_ et rk_ sont des secrets : ne les mettez jamais dans le code ni dans un outil en ligne, et n'utilisez que des chaînes factices pour les tests.