[PHP] Générateur de mots de passe pseudo-aléatoire

Discussion dans 'Web, design' créé par TheNastyBoy, 24 Février 2005.

Statut de la discussion:
Fermée.
  1. Offline
    TheNastyBoy B0rn t0 b3 r00t
    Salut !

    Je me suis lancé dans la programmation d'un générateur de mots de passe pseudo-aléatoire en PHP.

    Voici le code de l'unique page, genpass.php :
    Code:
    <?php
    
    function genpass($nb)
    	{
    	if($nb < 8)
    	{
    		print ("Un mot de passe de moins de 8 caractères sera trop faible, vous avez choisi un mot de passe d'une longueur de ".$nb." caractères.");
    	}
    	else
    	{
    		/* PREMIERE PARTIE : GENERATION DU MOT DE PASSE */
    						
    		// les différents types de caractères  
    		$lettre = "abcdefghijklmnopqrstuvwxyz";
    		$maj = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    		$chiffre = "0123456789";
    		$special = "&@$%*!.,;:_-#";
    		// je concatène tout
    		$carac = $lettre.$maj.$chiffre.$special;
    		
    		// création d'un mot de passe vide, paske sinon PHP me chie des bulles
    		$passwd = "";
    		// on lance la boucle
    		for ($i = 0; $i < $nb; $i++)
    			{
    			// génération d'un caractère pseudo-aléatoire
    			$indice = rand(0, strlen($carac) - 1);
    			// concaténation pour obtenir le mot de passe
    			$passwd = $passwd.$carac{$indice};
    			}
    		
    		
    		/* DEUXIEME PARTIE : VERIFICATION DE LA COMPLEXITE DU MOT DE PASSE */
    		
    		$veriftxt = 0;
    		$verifmaj = 0;
    		$verifnb = 0;
    		$verifspec = 0;
    		$totalverif = 0;		
    		for ($j = 0; $j < $nb; $j++)
    			{
    				$test = $passwd{$j};
    				if(ereg($test, $lettre))
    				{
    					$veriftxt = 1;
    				}
    			
    				if(ereg($test, $maj))
    				{
    					$verifmaj = 1;
    				}
    				
    				if(ereg($test, $chiffre))
    				{
    					$verifnb = 1;
    				}
    				
    				if(ereg($test, $special))
    				{
    					$verifspec = 1;
    				}
    			}
    			
    		if($veriftxt == 1 && $verifmaj == 1 && $verifnb == 1 && $verifspec == 1)
    		{
    			$totalverif = 1;
    		} 
    		else
    		{
    			print("<br>Mot de passe trop faible");
    		}
    	    
    		/* TROISIEME PARTIE : AFFICHAGE */
    		print("<br>votre mot de passe est ".$passwd);
    		}
    	}
    
    
    genpass(8);
    
    ?>
    A priori, tout semble bien aller. Mais parfois, il y a des warnings :
    Code:
    Warning: ereg(): REG_BADRPT:lrepetition-operator operand invalid in c:\program files\easyphp1-7\www\genpass.php on line 57
    
    Warning: ereg(): REG_BADRPT:lrepetition-operator operand invalid in c:\program files\easyphp1-7\www\genpass.php on line 62
    
    Warning: ereg(): REG_BADRPT:lrepetition-operator operand invalid in c:\program files\easyphp1-7\www\genpass.php on line 67
    
    Warning: ereg(): REG_BADRPT:lrepetition-operator operand invalid in c:\program files\easyphp1-7\www\genpass.php on line 72
    Ces warnings n'empêchent pas de générer un mot de passe. Si quelqu'un a une idée sur le pourquoi du comment ça serait vraiment sympa, je ne comprend pas trop pourquoi il me fait ces erreurs.
    TheNastyBoy, 24 Février 2005
    #1
  2. Offline
    Smart Touriste
    Tu testes d'office quatre fois (au lieu de faire des elseif) chaque lettre du password (au lieu de faire des regex plus propres).
    Pour tester si ton pass contient une minuscule, tu dois juste faire ereg("[a-z]",$passwd). ("[A-Z]" "[0-9]" "[tescaractèresspéciaux]").

    Je ne sais pas si ca peut résoudre ton problème, mais c'est une correction intéressante.

    ps : n'oublie pas d'échapper certains caractères spéciaux dans la regex.
    Smart, 24 Février 2005
    #2
  3. Offline
    WaKaaN JcQL
    ca veut dire quoi "parfois" ? ca ne le fait pas tout le temps ?
    WaKaaN, 24 Février 2005
    #3
  4. Offline
    null ose();
    Perso je fais comme ça :

    Code:
         function GenPassword($length = 6)
         {
             $cara = "abcdefghijklmnopqrstuvwxyz";
             $cara .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
             $cara .= "0123456789";
             
             for($i = 0; $i < $length; $i++)
             {
                  $j = rand(0, 62);
                  $password .= $cara[$j];
             }
             
             return $password;
         } //fin GenPassword()
    
    null, 24 Février 2005
    #4
  5. Offline
    noLain www.wearewise.be
    Code:
     function makeRandomPassword() {
      $salt = "abchefghjkmnpqrstuvwxyz0123456789";
      srand((double)microtime()*1000000);
          $i = 0;
          while ($i <= 7) {
                $num = rand() % 33;
                $tmp = substr($salt, $num, 1);
                $pass = $pass . $tmp;
                $i++;
          }
          return $pass;
     }
    noLain, 25 Février 2005
    #5
  6. Offline
    Xou I ♥ rien
    et le "décrypteur" de md5 :D

    Mais plus sérieusement, tu fais quoi sans savoir générer n'importe quel caractère ?
    Xou, 25 Février 2005
    #6
  7. Offline
    Xou I ♥ rien
    tout le monde débute :?

    Dans ce cas, vu que t'es d'un niveau avancé, tu vas pouvoir m'aider à trouver une soluce pour ->ceci<-
    Xou, 25 Février 2005
    #7
  8. Offline
    TheNastyBoy B0rn t0 b3 r00t
    Xyauh s'il te plait, ton problème reste sur ton thread.
    EDIT : bon cela dit, Cauchy si tu sais, partage d'abord et nargue les gens après.

    Bon, sinon les autres codes donnés par des gens son sympas mais ils ne testent pas si le mot de passe est fort ou faible. Or, mon problème de code vient de la partie de test :roll: Seul Smart semble s'en être rendu compte...

    J'ai fait quelques tests, et je me suis rendu compte que le problème ne vient ni de mon algo ni de mon implémentation, du moins pour la partie test (de toute façon ça va évoluer). Le problème vient de certains caractères spéciaux, j'en ai répertorié deux : "*" et "+", puisque l'erreur ne se produit que lorsque le password testé contient l'un ou l'autre (ou les deux) de ces caractères.

    Smart ton PS est donc beaucoup plus important que le reste de ton post...

    Bon, et si je veux "*" et "+", comment je les échappe? (Y parait qu'il n'y a pas de question conne :D)
    TheNastyBoy, 25 Février 2005
    #8
  9. Offline
    Styleman Touriste
    ouaip, tellement bete que n'importe quel débutant pourrait lui répondre, malgré ça, tu ne lui as pas répondu de réponse donc....
    Sinon TheNastyBoy pk tu t'en prend à Xyauh alors qu'il à mis ce lien la pour voir si Cauchy la star l'aiderais donc par ironie, et il savait bien que Cauchy n'allait pas répondre...

    Enfin, c'est ton thread ok, mais bon, ne te trompe pas d'ennemi (meme si ici il n'y a pas d'ennemi :cool: )
    Styleman, 25 Février 2005
    #9
  10. Offline
    TheNastyBoy B0rn t0 b3 r00t
    Pas de soucis, c'est enregistré ;)
    Bon alors, question halakon : comment je peux générer des passwords avec "+" et "*" sans que les tests fassent tout pleins de warnings? ?(
    TheNastyBoy, 25 Février 2005
    #10
  11. Offline
    MbK_ Etudjant
    comme en PHP normale, tu mets un antislashe devant \


    en l'occurence : (si je ne me trompe pas)

    preg_match( "&@\$%\*\!\.,;:_#\+-","$chaine");

    (n'oublie pas de mettre le "-" a la fin de la chaine



    source : siteduzero.com
    MbK_, 25 Février 2005
    #11
  12. Offline
    TheNastyBoy B0rn t0 b3 r00t
    L'échappement des caractères ne résoud pas grand-chose, je dirais même que ça rajoute des ennuis :
    Code:
    Warning: ereg(): REG_EESCAPE:ttrailing backslash (\) in c:\program files\easyphp1-7\www\genpass.php on line 60
    
    Warning: ereg(): REG_EESCAPE:ttrailing backslash (\) in c:\program files\easyphp1-7\www\genpass.php on line 64
    
    Warning: ereg(): REG_EESCAPE:ttrailing backslash (\) in c:\program files\easyphp1-7\www\genpass.php on line 68
    
    Warning: ereg(): REG_EESCAPE:ttrailing backslash (\) in c:\program files\easyphp1-7\www\genpass.php on line 72
    Avec $special = "&@$%.;:,_#!-\+"; (sachant que j'ai testé tous les caractères avant "+", ils ne posent pas problème sans "\").

    Pour preg_match, je croule sous les erreurs, et celle ci-dessu en fait partie...[/quote]
    TheNastyBoy, 1 Mars 2005
    #12
  13. Offline
    MbK_ Etudjant
    ds une regex, tu dois mettre le caractere - en fin de chaine. n'oublie pas!
    MbK_, 1 Mars 2005
    #13
  14. Offline
    zoheir cvm.mangaleet()
    je pense que l'algorithme du rand peut etre facilement trouvable dans la doc php, donc c'est inutile
    zoheir, 2 Mars 2005
    #14
  15. Offline
    Xou I ♥ rien
    Si tu remarques, ce cher Cauchy se moque de tout le monde pour son niveau soi-disant avancé du PHP.
    C'est cette remarque que je voulais faire.
    Xou, 2 Mars 2005
    #15
Statut de la discussion:
Fermée.