Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

GÉNÉRATEUR DE MOTS DE PASSE


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 13/05/2006 15:57:32 Vu : 11 063 fois

Note :
Aucune note

Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note

Description

En PHP, nous sommes souvent invités à générer des codes quelconques de manière aléatoire. Ça peut être utile lorsqu'un membre perd son mot de passe ou encore lors de l'inscription afin de valider bref, trouvez-y l'utilité que vous voulez, je vous montre ici comment créer un générateur de codes aléatoires contenant des lettres majuscules, des lettres minuscules ou encore des chiffres. Notez que j'ai rédigé ce tutorial principalement pour mon site, donc je vous invite à vous référez à mon site (http://www.la-page.qc.ca) si vous obtenez un quelconque problème dans la réalisation de notre générateur de mots de passe.

Tutorial


Donc, voici ce que nous verrons dans le tutorial :
  • Les arrays en PHP
  • Générer un nombre aléatoire
  • Créer une fonction pour générer des codes aléatoires


Les arrays

Comme dans tous les langages, PHP nous permet d'utiliser des arrays. Les arrays sont ni plus ni moins que des tableaux, pouvant contenir des informations quelconques. Pour créer un array, nous  utilisons le mot réservé array et nous entrons des valeurs pour chaque case du tableau, séparés par des virgules. Un array peut contenir des chaînes de caractères ou encore des nombres. Exemple :

<?php
$mon_array = array('chaine', 3, 'autrevaleur');
?>


Nous pourrions ajouter autant de valeur que nous le désirons, ça n'a aucune importance. Pour accéder à ces valeurs, nous utilisons le nom du array avec entre crochets le numéro de la case à laquelle nous voulons accéder. Notez bien que la numérotation des cases commence toujours à 0. Donc, si je veux accéder à la première case, je procède ainsi :

<?php
$mon_array = array('chaine', 3, 'autrevaleur');

echo $mon_array[0];
?>


Et j'obtiendrai comme résultat l'affichage de "chaine" sur ma page.

Il est possible de créer des associations afin d'accéder aux cases autrement que par des numéros à l'aide du symbole =>. Sur l'exemple qui suit, je créer une variable $config qui me permettra de me connecter à ma base de données :

<?php
$config = array('host' => 'localhost', 'user' => 'alexbad', 'pass' => 'ale123', 'base' => 'lapage');

//Et si je veux me connecter :
$connect = mysql_connect($config['host'], $config['user'], $config['pass']);
mysql_select_db($config['base']);

mysql_close($connect);
?>


Il est aussi possible de faire des déclaration plus simples, sans utiliser la fonction array :

<?php
$config = array(); //Je déclare mon tableau
$config['host'] = 'localhost';
$config['user'] = 'alexbad';
$config['pass'] = 'ale123';
$config['base'] = 'lapage';
?>


Ce qui donnera exactement le même résultat. Voilà, c'est suffisant pour les tableaux, voyons maintenant comment générer un nombre aléatoire.

Générer un nombre aléatoire

Pour générer un nombre aléatoire, nous devons utiliser la fonction rand(). Cette fonction requiert deux paramètres :

  1. Le nombre de départ
  2. Le nombre limite


Par exemple, si je veux générer un nombre aléatoire entre 98 et 504, je procède ainsi :

<?php
$nombre_aleatoire = rand(98, 504); //Cette variable contient désormais un nombre aléatoire entre 98 et 504, il sera différent à chaque exécution du script

//Et on peut l'afficher ;)

echo $nombre_aleatoire;
?>


C'est aussi simple que ça pour les nombres aléatoires, voyons maintenant comment mettre en relation les arrays et la fonction rand() pour créer un générateur de mots de passe.

Générer un code aléatoire

Nous allons procéder simplement, nous créerons une fonction qui nécessitera un paramètre : le nombre de caractères du code à générer. Moi, j'appelle ma fonction "generer", vous pouvez faire comme vous voulez :

<?php
function generer($longueur)
{


}
?>


Maintenant, nous allons créer une boucle qui générera aléatoirement un seul et unique caractère. Si notre boucle tourne 7 fois, nous aurons un code de 7 caractères aléatoires, simple non?

<?php
function generer($longueur)
{
    for ($i = 1; $i <= $longueur; $i++)
    {
    //On génère le code
    }

}
?>


Notre code pourra contenir trois types de caractères :

  1. Des lettres minuscules
  2. Des lettres majuscules
  3. Des chiffres


Pour les chiffres, c'est simple, nous utiliserons la fonction rand(). Par contre, pour les lettres, majuscules et minuscules, nous utiliserons des arrays. Dans ces arrays, nous stockerons toutes les lettres de l'alphabet. Exemple :

<?php
function generer($longueur)
{
$minuscules = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

$majuscules = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
    for ($i = 1; $i <= $longueur; $i++)
    {
    //On génère le code
    }

}
?>

Maintenant, à chaque tour de boucle, nous ajouterons un caractère à notre code et à la toute fin, lorsque la boucle est terminée, nous retournons le résultat.

Pour générer des lettres aléatoires, nous créerons un nombre aléatoire situé entre 0 et 25, puisque notre array commence à 0. Et nous accéderons à la case du tableau correspondante. Pour  déterminer quel type de caractère nous devons générer, nous utiliserons un nombre aléatoire compris entre 0 et 2 inclusivement. Si c'est 0, c'est un chiffre, si c'est 1, c'est une lettre majuscule et finalement, si c'est 2, c'est une lettre minuscule. Pour tester le tout, j'utilise le branchement conditionnel switch(). Vous pouvez le faire très bien avec des if(), ça donne exactement le même résultat. Notez que sur l'exemple qui suit, j'ai déclaré la variable $code, à laquelle nous ajouterons un caractère à chaque tour de boucle :

<?php
function generer($longueur)
{
$minuscules = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

$majuscules = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');

$code = ''; //On déclare notre variable
    for ($i = 1; $i <= $longueur; $i++)
    {
    //On génère un type aléatoire
    $type = rand(0,2);

        switch ($type)
        {
            case 0:
            //On génère un chiffre
            break;
            
            case 1:
            //On génère une lettre majuscule
            break;
            
            case 2:
            //On génère une lettre minuscule
            break;
        }
    }
return $code; //On retourne le code généré au complet
}
?>

Ensuite, comme expliqué plus haut, nous générons selon le cas. Remarquez bien comment je procède pour les lettres :

<?php
function generer($longueur)
{
$minuscules = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

$majuscules = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');

$code = ''; //On déclare notre variable
    for ($i = 1; $i <= $longueur; $i++)
    {
    //On génère un type aléatoire
    $type = rand(0,2);

        switch ($type)
        {
            case 0:
                 $caractere = rand(0,9);
                             $code .= $caractere;
            break;
            
            case 1:
                 $nbre_aleatoire = rand(0, 25);
                             $caractere = $majuscules[$nbre_aleatoire];
                             $code .= $caractere;
            break;
            
            case 2:
                 $nbre_aleatoire = rand(0, 25);
                             $caractere = $minuscules[$nbre_aleatoire];
                             $code .= $caractere;
            break;
        }
    }
return $code; //On retourne le code généré au complet
}
?>

Aussi simple que ça . Et tiens, pour ceux qui ne sont pas habitués aux switch(), voici comment procéder avec des simples conditions :

<?php
function generer($longueur)
{
$minuscules = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

$majuscules = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');

$code = ''; //On déclare notre variable
    for ($i = 1; $i <= $longueur; $i++)
    {
    //On génère un type aléatoire
    $type = rand(0,2);
        if ($type == 0)
        {
            $caractere = rand(0,9);
            $code .= $caractere;
        }
        if ($type == 1)
        {
            $nbre_aleatoire = rand(0, 25);
            $caractere = $majuscules[$nbre_aleatoire];
            $code .= $caractere;
        }
        if ($type == 2)
        {
            $nbre_aleatoire = rand(0, 25);
            $caractere = $minuscules[$nbre_aleatoire];
            $code .= $caractere;
        }
    }
return $code; //On retourne le code généré au complet
}
?>

Essayez, ça donne exactement le même résultat ;)

Ensuite, pour utiliser cette fonction, vous devez l'appeller, comme cela :

<?php
$nbre_chars = 7; //Changez ce nombre, vous verrez ;)

$code = generer($nbre_chars);

echo $code; //On affiche le résultat :p
?>

Remarque : Pour utiliser votre fonction, elle doit être déclarée sur la page sur laquelle elle est appellée. Vous pouvez aussi la placer en include, ça donnera le même résultat. Sinon, ça ne fonctionnera pas.

Voilà, c'est déjà terminé, c'était pas bien difficile.
N'hésitez pas à poster vos commentaires ou encore à poser vos questions, ça me fera toujours plaisir d'y répondre  .
signaler à un administrateur
Commentaire de coucou747 le 14/05/2006 16:13:51

tu penses quoi de :

md5(microtime())

signaler à un administrateur
Commentaire de Alexbad le 14/05/2006 18:12:52

Avec ma fonction, tu peux déterminer la longueur du code, de 1 caractère à autant que tu veuilles, ce qui n'est pas le cas avec ta technique bref, je trouve ma méthode plus flexible.

signaler à un administrateur
Commentaire de coucou747 le 14/05/2006 18:19:41

et substr derière...

signaler à un administrateur
Commentaire de pastis51forever le 28/05/2006 02:06:50

Bonjour!

Je ne pense pas me tromper en disant qu'on peut aussi faire
$alphabet='abcde...';
pour créer le tableau
$alphabet=array('a','a','c','d','e',...);
mais c'est a vérifier...
Sinon, même si ca change pas grand chose en php et particulièrement dans cet exemple, c'est quand même bien de prendre des bonnes habitudes par rapport aux types de variables:
5 === '5' renvoit false, donc pour ton exemple j'aurais mis
$chiffres=array('0','1','2'...);
Dans tous les cas, statistiquement, tu auras plus de chances d'avoir un 0 qu'un a ou qu'un A par exemple... (1 chance sur 3 d'avoir un des 10 chiffres contre 1 chance sur 3 d'avoir une des 26 lettres, minuscules ou majuscules).
Pour faire plus logique (et plus simple), tu devrais donc faire:

function generer($longueur)
{
$caracteres = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$code = ''; //On déclare notre variable
for ($i = 1; $i <= $longueur; $i++)
    {
    //On génère un nombre aléatoire
    $nbre_aleatoire = rand(0, 61); //(61, si mes calculs sont bons...)
    $caractere = $caracteres[$nbre_aleatoire];
    //ou meme a partir de php4, pour suivre les directives:
    //$caractere = $caracteres{$nbre_aleatoire};
    $code .= $caractere;
    }
return $code; //On retourne le code généré au complet
}
en version courte:
function generer($longueur)
  {
  $caracteres = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  for ($i = 1; $i <= $longueur; $i++)
    $code .= $caracteres{rand(0, 61)};
  return $code; //On retourne le code généré au complet
  }
J'ai pas essayé, mais je pense que ca doit faire l'affaire aussi.
Dans tous les cas, il ne faut pas prendre mes remarques comme des critiques, mais plus comme des points de vue. Je ne critique pas car moi-même je n'ai jamais pris le temps de déposer un seul tuto...

Brice

signaler à un administrateur
Commentaire de coucou747 le 28/05/2006 11:27:42


"Je ne pense pas me tromper en disant qu'on peut aussi faire
$alphabet='abcde...';
pour créer le tableau
$alphabet=array('a','a','c','d','e',...);
mais c'est a vérifier..."=> en fait, tu as tord : on ne fait pas un tableau, mais une chaine de caractères, en C, un tableau de char, c'est une chaine de caractères, mais pas en php... pas tout à fait... utilise gettype pour t'en assurer...

Mais on peut faire : $string[$position] pour obtennir le caractère qui se trouve à la positon $position (php5, en php4, il fallait faire $string{$position}, enfin les deux fonctionnent, mais l'un est dépressé.)

signaler à un administrateur
Commentaire de pastis51forever le 29/05/2006 22:08:50

Merci pour la rectification coucou747.
Je me souvenais bien avoir utilisé $string[$position], et j'en ai déduit certainement un peu trop vite que c'était un tableau, ce qui aurait surement fini par des arrachages de cheveux sur des tests (===).
Sinon, dans le fond, je pense que mon raisonnement tient la route...

Brice

signaler à un administrateur
Commentaire de coucou747 le 29/05/2006 22:31:55

perso, je préfères mon générateur...

signaler à un administrateur
Commentaire de pastis51forever le 29/05/2006 22:35:28

Moi je donnais juste une idée pour simplifier sa methode... C'est certainement pas celle que j'utilise moi, qui elle est plus dans l'idée de ce que tu as proposé

signaler à un administrateur
Commentaire de Alexbad le 30/05/2006 13:53:34

Bah, vous prenez la méthode qui vous plaît, mon but était d'apprendre à utiliser les arrays et à leur trouver une utilité, certes il y a bien d'autres utilité mais c'est un exemple où tout le monde voit bien que ce serait impossible sans les arrays... du moins si on conserve cette méthode.

signaler à un administrateur
Commentaire de coucou747 le 30/05/2006 18:07:12

Alexbad, relis le commentaire de pastis51forever... on n'a pas besoin des arrays pour ça !

signaler à un administrateur
Commentaire de coucou747 le 30/05/2006 18:07:14

Alexbad, relis le commentaire de pastis51forever... on n'a pas besoin des arrays pour ça !

signaler à un administrateur
Commentaire de minimax87 le 30/08/2006 00:17:56

J'aimerais faire quelque chose avec le script pour les nombres aléatoires mais je ne sais pas comment.J'ai plusieurs variables $nombre_aleatoire mais je veux pas qu'il y ait des chiffres qui se répétent...
merci

signaler à un administrateur
Commentaire de hisoka2501 le 04/10/2006 23:25:21

"tu penses quoi de :
md5(microtime())"

fascil: COMPLETEMENT NULL
pourqoi ? => car un md5 breaker sera ultra rapide sur ce genre de passe en mode numerique il tournera a une vitesse affolante
sous linux un md5 se brise generalement a 5M de passe par secondes

donc un pass générée de cette fascon serais ULTRA fragile

en revanche: range('A','z') dans une boucle pourais etre de bon ton :)

genre:

$rpass = NULL;
for ($i = 0;$i <= 20;$i++) $rpass .= range('A','z')

signaler à un administrateur
Commentaire de hisoka2501 le 04/10/2006 23:55:27

en fait j'ai mieux:

$len = 10;
$rpass = NULL;
$chars = array_merge(range('A','Z'),range('a','z'),range('0','9'));
$cmax = count($chars) -1;
for ($i = 0;$i <= $len;$i++) $rpass .= $chars[rand(0,$cmax)];

pour un cas ou vous voulez un mdp de 10 chars de long :)
la chaine est dans $rpass :)

signaler à un administrateur
Commentaire de Melnofil le 09/10/2006 00:08:25

Alexbad :
1) Ce code n'est valide que depuis PHP 4.2.0 car sinon il faut initialiser le générateur de nombres aléatoires.
2) Depuis PHP 3.0.6 il existe la fonction mt_rand() qui est 4 fois plus rapide que rand() pour une qualité équivalente.
3) La fonction mt_rand() (et donc rand() aussi) n'a pas une sécurité suffisante pour faire un bon mot de passe. A la place vous pouvez fouiller les librairies de cryptages qui fournissent presque toujours des générateurs de mot de passe robustes.... Par exemple l'agorithme MCRYPT_RAND doit faire ca dans mcrypt :
http://fr.php.net/manual/fr/ref.mcrypt.php

De toutes facons ton aléatoire est pas correct si tu veux passer par des tableaux fait comme hisoka2501 sinon avec des chaines comme (la version courte de) pastis51forever.

signaler à un administrateur
Commentaire de coucou747 le 10/11/2006 18:33:00

hisoka2501 je veux bien savoir exactement pourquoi tu peux à partire de :

$a=substr(md5(microtime(), 0, 10);

trouver $a à partir de md5($a)

aussi facilement que tu le prétends...

sinon, on ne fais pas NULL+'texte' mais ''+'texte' en php donc remplace $pass=NULL; par $pass='';

signaler à un administrateur
Commentaire de OneHacker le 01/05/2007 12:14:13

La fonction MD5 en PHP est fausse, si vous regardez la DLL de CSLib vous verrez que c'est pas correct

signaler à un administrateur
Commentaire de galoXer le 28/01/2008 00:00:35

Il y a tellement plus simple et plus léger...

   function gen_id($nb_carac)
      {
     $x = 0;
while($x < $nb_carac)
    {
   $letter = str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789');
   $code .= substr($letter,0,1);
   $x++;
}
return $code;
  }

signaler à un administrateur
Commentaire de coucou747 le 28/01/2008 06:41:54

meme si elle etait "fausse", ca chance quoi ?
en quoi est-elle fausse ?

signaler à un administrateur
Commentaire de Melnofil le 31/01/2008 20:23:56

OneHacker : Vu le nombre de gens qui s'en servent ça m'étonnerais bcp ;-)

galoXer : Les mots de passe que tu génère auront la même qualité que ceux d'hisoka2501, par contre elle est extrêmement lourde puisqu'à chaque itération tu vas devoir mélanger entièrement ta chaine pour extraire un unique caractère. La fonction str_shuffle() n'est tout simplement pas adapté à ce genre de problème, utilise plutôt la fonction mt_rand() pour extraire un caractère au hasard de ton charset : "abcd...56789". ("mt_rand()" est nettement plus rapide que "str_shuffle()" puisque la seconde doit faire plusieurs appels à la première pour te sortir un résultat)

coucou747 : Comme tu te base sur la fonction "microtime()", il suffit que la date de génération du mot de passe soit connue à moins de 17 minutes près et la sécurité de ton mot de passe (quelque soit le nombre de caractère que tu as conservé) devient inférieure à celle d'un mot de passe de 5 caractères de long (soit seulement 1 milliard de mot de passe possible).
C'est encore pire si tu stocke une date quelconque dans la même page PHP que celle qui génère le mot de passe : Avec une précision d'une seconde, cela donnerait une sécurité à peine supérieure à un mot de passe de 3 caractères de long.
La fonction mt_rand() donne un meilleur résultat car l'horloge système n'est pas utilisée en solo pour générer du hasard.
Pour finir, je te fais la remarque que l'appel à "md5()" ne change rien au problème et ça risque plutôt de baisser la sécurité par rapport à si tu avais utilisé "microtime()" comme mot de passe directement (Il ne faut JAMAIS combiner des algorithmes de hasard ou de cryptologie car la sécurité ne fait alors que baisser, c'est une "règle" connue)

signaler à un administrateur
Commentaire de Melnofil le 01/02/2008 16:39:39

UP pour ajouter ma version de la fonction de pastis51forever avec petites 3 modifications :
function generer($longueur = 8, $caracteres = NULL) // Je met les caractères possibles en arguments c'est toujours pratique ;-)
{
    if (!is_string($caracteres) || $caracteres === '')
       $caracteres = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $max = strlen($caracteres) - 1; // Evitons d'appeler "strlen()" trop souvent !
    $code = '';
    while ($longueur-- > 0) // Inutile de créer une variable temporaire $i
        $code .= $caracteres[mt_rand(0, $max)]; // Meilleur compatibilité : L'usage des {} sera abandonné dans PHP 6
    return $code;
}

Si vous préférez manipuler des tableaux (malgré le fait que cela soit moins rapide) vous pouvez utiliser cette variante du code précédent (Là j'ai fais un mixte entre les posts de pastis51forever, hisoka2501 et des ajouts persos) :
if (function_exists('str_split')) // pour PHP 5 ou plus
{
    function generer($longueur = 8, $caracteres = NULL)
    {
        if (!is_array($caracteres) || !$caracteres)
            $caracteres = str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
        $code = '';
        while ($longueur-- > 0)
            $code .= $caracteres[array_rand($caracteres)];
        return $code;
    }
}
else // pour PHP 4.1.x ou plus
// Note : Évitez d'utiliser "range()" sur des caractères pour améliorer la compatibilité jusqu'à PHP 4.0.x.
{
    function generer($longueur = 8, $caracteres = NULL)
    {
        if (!is_array($caracteres) || !$caracteres)
            $caracteres = array_merge(range('A','Z'),range('a','z'),range('0','9'));
        $code = '';
        while ($longueur-- > 0)
            $code .= $caracteres[array_rand($caracteres)];
        return $code;
    }
}
Pour info, j'ai testé les 2 fonctions sous PHP 5.1.6 et 4.2.2 et ça fonctionne.
Si vous souhaitez faire mieux, utilisez plutôt un(e) librairie/module spécialisé(e) car les algorithmes utilisés ne sont pas à la portée du commun des programmeurs :-P

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,109 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.