Regex strong password
The most copied password regex in the world (2.4k votes on Stack Overflow) has a real flaw: its special-character whitelist silently rejects any password containing a comma, a period, or an unlisted symbol. Here's a pattern that enforces the same rules without restricting which characters are allowed.
/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\W)(?!.* ).{8,}$/passes 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — réponse la plus votée au monde sur le sujet, 2,4k votes (Srinivas) | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$ | 15 / 20 | undetermined |
| Stack Overflow — variante « simple » de la même réponse (lettres + chiffre seulement) | ^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$ | 8 / 20 | undetermined |
| Stack Overflow — réponse à 67 votes, non adaptée (plafond de 16 caractères conservé) | ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\W)(?!.* ).{8,16}$ | 19 / 20 | undetermined |
Implementation
const re = new RegExp("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\\W)(?!.* ).{8,}$", "");
re.test(input);Limits
- Valide seulement la forme (longueur + catégories de caractères), jamais la résistance réelle : « Passw0rd! » satisfait la règle mais reste un mot de passe trivial à deviner (dictionnaire + substitutions courantes).
- N'interdit que l'espace littéral : une tabulation ou un retour à la ligne collé par erreur passe silencieusement (voir le cas « Tab\tPass1! » du corpus).
- Aucune vérification contre une liste de mots de passe compromis (ex. Have I Been Pwned) — la seule protection réellement efficace selon NIST 800-63B, qu'une regex ne peut pas fournir.
- Le plafond de longueur a été volontairement retiré ({8,} au lieu de {8,16}) : un plafond bas rejette les phrases de passe longues, pourtant recommandées, sans bénéfice de sécurité réel.