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

Statut
N'est pas ouverte pour d'autres réponses.

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.
 

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.
 

WaKaaN

JcQL
ca veut dire quoi "parfois" ? ca ne le fait pas tout le temps ?
 

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()
 

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;
 }
 

Xou

I ♥ rien
Cauchy a dit:
on a inventé le md5 :?
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

I ♥ rien
Cauchy a dit:
Nan ca me fait juste rire les ptits gamerziens qui ont du mal avec un bete générateur de caractère :D
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<-
 
1er
OP
TheNastyBoy

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)
 

Styleman

Touriste
Cauchy a dit:
Xyauh a dit:
Cauchy a dit:
on a inventé le md5 :?
et le "décrypteur" de md5 :D

Mais plus sérieusement, tu fais quoi sans savoir générer n'importe quel caractère ?
Nan ca me fait juste rire les ptits gamerziens qui ont du mal avec un bete générateur de caractère :D
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: )
 
1er
OP
TheNastyBoy

TheNastyBoy

B0rn t0 b3 r00t
Styleman a dit:
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: )
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? ?(
 

MbK_

Etudjant
TheNastyBoy a dit:
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)
comme en PHP normale, tu mets un antislashe devant \


Métacaractères

Les métacaractères sont :

! ^ $ ( ) [ ] { } ? + * . \
Le point d'exclamation est un métacaractère dans la mesure où on s'en sert de délimiteur.

Pour utiliser un métacaractère dans une recherche, il faut l'échapper avec un antislash : \
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
 
1er
OP
TheNastyBoy

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]
 

MbK_

Etudjant
ds une regex, tu dois mettre le caractere - en fin de chaine. n'oublie pas!
 

zoheir

cvm.mangaleet()
Xyauh a dit:
Cauchy a dit:
on a inventé le md5 :?
et le "décrypteur" de md5 :D

Mais plus sérieusement, tu fais quoi sans savoir générer n'importe quel caractère ?
je pense que l'algorithme du rand peut etre facilement trouvable dans la doc php, donc c'est inutile
 

Xou

I ♥ rien
cvm leet a dit:
Xyauh a dit:
Cauchy a dit:
on a inventé le md5 :?
et le "décrypteur" de md5 :D

Mais plus sérieusement, tu fais quoi sans savoir générer n'importe quel caractère ?
je pense que l'algorithme du rand peut etre facilement trouvable dans la doc php, donc c'est inutile
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.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut