IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Expression régulière (regex) pour tester le format d'un password


Sujet :

JavaScript

Vue hybride

steph68b Expression régulière (regex)... 25/02/2016, 11h37
SpaceFrog pour moi ce n'est pas... 25/02/2016, 12h35
steph68b pas de solution alors? :( 25/02/2016, 12h51
steph68b cela dit, s'il faut faire 4... 25/02/2016, 13h07
Gnuum Mais si, mais si voyons! Tout... 25/02/2016, 16h04
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut Expression régulière (regex) pour tester le format d'un password
    Hello,

    J'ai énormément de mal avec les regex, ça ne rentre pas dans ma logique (ou vice versa!), je n'y arrive pas, je n'arrive à rien en fait!

    Quelqu'un pourrait-il me monter une regex permettant de tester le format d'un mot de passe correspondant aux critères suivant:
    -> 6 caractères minimum (max = 10, pense suffisant non? d'autant plus que je vais aussi rajouter un salt, avant cryptage SHA512)
    -> au moins 1 chiffre
    -> au moins 1 majuscule
    -> au moins un caractère spécial
    (avec les annotations pour comprendre)

    Expression que je pourrais ensuite coller dans une fonction renvoyant true/false.

    Question subsidiaire: mes critères de password sont-ils assez bons pour vous, ou comment feriez-vous, vous?

    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    pour moi ce n'est pas possible en une seule reg ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    pas de solution alors?

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    cela dit, s'il faut faire 4 tests imbriqués dans des if(...) else if(...) moi ça me va aussi, pas de souci.

    Le tout étant de trouver les 4 règles des 4 test:

    1.) pour les chiffres on aurait un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reg = /[0-9]/; 
    reg.exec(document.inscription.Passwd.value)
    -> tu confirmes?


    2.) pour les lettres maj/min on aurait un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reg = /[a-zA-Z]/; 
    reg.exec(document.inscription.Passwd.value)
    -> tu confirmes?


    3.) nb car min(6)/max(10)?
    4.) la présence de caractères spéciaux?
    -> formule générique possible?
    OU
    -> indique 1 par 1 ceux que l'on souhaite voir utilisé?

  5. #5
    Membre émérite
    Avatar de Gnuum
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Billets dans le blog
    1
    Par défaut
    Mais si, mais si voyons! Tout est possible en RegExp!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    function isValidPassword(password) {
        var charactersTypes = [
                '[A-Z]', // lettre majuscule
                '[0-9]', // chiffre
                '[^\\w]' // caractère non alphanumérique
            ]
        ;
     
        // On fabrique les différences séquences possible: chiffre-majuscule-caractère spécial, majuscule-caractère spécial-chiffre, ... (il y en a 6).
        var possibleSequences = [];
     
        for (var i = 0; i < charactersTypes.length; i++) {
            var possibleSequence = [charactersTypes[i]];
     
            for (var j = 0; j < charactersTypes.length; j++) {
                if (i === j) {
                    continue;
                }
     
                possibleSequence.push(charactersTypes[j]);
            }
     
            possibleSequences.push(possibleSequence);
     
            var possibleSequence = [charactersTypes[i]];
     
            for (var j = charactersTypes.length - 1; j >= 0 ; j--) {
                if (i === j) {
                    continue;
                }
     
                possibleSequence.push(charactersTypes[j]);
            }
     
            possibleSequences.push(possibleSequence);
        }
     
        // On crée une liste de pattern d'expression régulière vérifiant les différentes séquences.
        var patterns = [];
     
        for (var i = 0; i < possibleSequences.length; i++) {
            var possibleSequence = possibleSequences[i];
     
            // En ES6 (avec les "Littéraux de gabarits" cela donne:
            // + veut dire au moins 1
            // .* entre les différents caractères veut dire n'importe quel caractère 0 ou n fois.
            patterns.push(
                `${possibleSequence[0]}+.*${possibleSequence[1]}+.*${possibleSequence[2]}+`
            );
        }
     
        // On concatène les différentes séquence dans une seule et même expression régulière.
        // | veut dire "ou", ce qui veut dire qu'on va vérifier que le mot de passe vérifie une des séquences.
        var passwordCheck = new RegExp(patterns.join('|'));
     
        // Teste le mot de passe et renvoie true si il match, false sinon.
        return passwordCheck.test(password)
    }
     
     
    console.log(isValidPassword('abcde'));       // false
    console.log(isValidPassword('abCde0'));      // false
    console.log(isValidPassword('abCd@e'));      // false
    console.log(isValidPassword('ab5de#0'));     // false
    console.log(isValidPassword('abC@de0'));     // true
    console.log(isValidPassword('a@bezC0ceaz')); // true
    La manière programmatique, c'est pour comprendre ce qu'il se passe (l'algorithme peut certainement être bien amélioré!). En abrégé, ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function isValidPassword(password) {
        return /[A-Z]+.*[0-9]+.*[^\w]+|[A-Z]+.*[^\w]+.*[0-9]+|[0-9]+.*[A-Z]+.*[^\w]+|[0-9]+.*[^\w]+.*[A-Z]+|[^\w]+.*[A-Z]+.*[0-9]+|[^\w]+.*[0-9]+.*[A-Z]+/.test(password);
    }
    Après c'est surtout pour la beauté du geste. Pour un soucis de compréhension (et certainement de performance), je le ferais en plusieurs expressions régulières.

    PS: je ne limiterais pas la taille maximale (en tout cas pas à 10).
    PS2: j'ai triché, je n'ai pas vérifié la taille globale du password dans ma regexp (password.length >= 6).

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    J'allais poster que j'avais trouvé un début de piste avec mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reg = /[a-z]+[A-Z]+[0-9]+/g;
    .......... sauf qu'évidement, de cette manière là un mot débutant avec 1 maj/chiffre renverra false, même si tous les critères sont là......... mais pas dans le bon ordre!!

    Je cherchais donc comment caser un 'ou' dans ma regexp............

    MAIS à voir ta réponse, j'étais encore TRES loin du compte!!
    Et j'en étais donc arrivé à vouloir faire une analyse syntaxique manuelle à la place!

    Je vais jeter un oeil sur ton code, pour essayer de comprendre, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. regex pour tester un mail ou une URL
    Par rambc dans le forum Général Python
    Réponses: 10
    Dernier message: 23/02/2010, 12h37
  2. Réponses: 1
    Dernier message: 04/09/2009, 12h37
  3. Réponses: 4
    Dernier message: 20/10/2008, 22h34
  4. Problème de pour tester le format d'une String
    Par Virg62 dans le forum Langage
    Réponses: 3
    Dernier message: 12/02/2008, 18h30
  5. pb avec expression régulière (regex)
    Par rudhf dans le forum C#
    Réponses: 12
    Dernier message: 10/05/2007, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo