TUTORIELS 
Chiffrement de mots de passe utilisateurs en PHP
Présentation des principaux algorithmes de chiffrement, et de leurs implémentations dans les principaux langages.  (1 octobre 2002)
 

Suite de notre article de présentation des principales méthodes et librairies de chiffrement, nous abordons ici un cas concret: la gestion de mots de passe dans le cadre d'un site dont une partie n'est accessible que pour les membres ayant un mot de passe. La liste des membres et leurs mots de passe sont stockés dans une base de données.
Il est a noter que ce sytème n'est valable que pour une seule et même page. A partir du moment où l'on travaille avec un ensemble de pages qui ne doivent être accessibles que par des membres, il devient nécessaire de mettre au point un réel système d'authentification ou de sessions utilisateurs. Ce n'est pas le sujet de cet article. La gestion de session en PHP a déjà été abordée sur le JDNet Développeurs.

Nous avons d'entrée de jeu un choix à prendre selon l'administration qui sera faite autour de ces mots de passes: souhaite-t-on pouvoir accéder au mot de passe, ou celui-çi ne doit-il être connu que de l'utilisateur seul, et donc ne pas être stocké "en dur" dans la base ? C'est en répondant à cette question que nous pourrons lancer les bases de notre système de gestion de mots de passe.
Nous ne travaillerons ici que sur le second cas, la méthode du chiffrement réversible appliquée aux mots de passe nécessitant un article à part entière.

Nous supposons que nous disposons d'une table "membres" composée des champs "nom", "pass" et "clef".

Description du système
Nous utiliserons la fonction interne md5(), plus sûre et mieux reconnue que crypt(). Les mots de passes sont créés à l'aide du code suivant:

(fichier creationpass.php)
<?php
// l'utilisateur entre son nom, son mot de passe et sa clef
// (cela peut-être son mois de naissance ou le nom de jeune fille
// de sa mère), stockés dans $nom, $pass et $clef.

if ($HTTP_POST_VARS)
  {
  $password = md5($pass);
  $key = md5($clef);
 
  echo "Votre mot de passe: ".$pass."<br>";
  echo "Son <i>hash</i> est: ".$password."<br>";
  echo "Votre clé est: ".$clef;
  // $nom, $password et $key sont ensuite stockées
  // dans la base de données.
  }
?>

Le login se fera de la manière suivante: ayant récuperé le mot de passe, on le hash, et on compare le hashage à celui stocké sur le serveur...

(fichier login.php)
<?php
// l'utilisateur entre son nom et son mot de passe via
// un formulaire HTML qui les stocke dans $membre et $pass.

if ($HTTP_POST_VARS)
  {
  // connexion à la base de données des membres.
  $passmd5 = md5($pass);
  $requete = "SELECT nom FROM membres
    WHERE nom = '$membre' AND pass = '$passmd5'";

  if (mysql_num_rows(mysql_query($requete)) == 1)
    echo 'Vous êtes membre!';
  }
?>

Finalement, parce qu'il faut toujours prévoir les actions de ses utilisateurs, il faut construire un système où l'utilisateur qui a oublié son mot de passe, pourra s'en voir attribuer un nouveau, aléatoire, en entrant sa clef. Bien entendu, une fois qu'il aura accés à son compte, il faudra qu'il puisse y entrer un nouveau mot de passe étant donné que celui-ci ne sera pas très aléatoire...

(fichier newpass.php)
<?php
// l'utilisateur entre son nom et sa clef via
// un formulaire HTML qui les stocke dans $membre et $clef.

// generateur de mot de passe aléatoire mais lisible
function genPass()
  {
  $consonnes='bcdfgjklmnpqrstvxz';
  $voyelles='aeiouy';
  for ($i=0; $i < 7; $i++)
    {
    mt_srand((double) microtime() * 1000000);
    $consonne[$i] =
      substr($consonnes, mt_rand(0, strlen($consonnes)-1), 1);
    $voyelle[$i] =
      substr($voyelles, mt_rand(0, strlen($voyelles)-1), 1);
    }
  return $consonne[0] . $voyelle[4] .$consonne[3]
    . $consonne[1] . $voyelle[0] . $consonne[2];
  }

if ($HTTP_POST_VARS)
  {
  // connexion à la base de données des membres.
  $key = md5($clef);
  $requete = "SELECT nom FROM membres
    WHERE nom = '$membre' AND clef = '$key'";

  if (mysql_num_rows(mysql_query($requete)) == 1)
    {
    $newKey = genPass();
    echo 'Vous êtes membre!<br>';
    echo 'Votre nouveau pass est: '.$newKey;
  
  // $newKey est ensuite stockée dans la base
    // à la place de l'ancien mot de passe.
    }
  }
?>

Ce ne sont là que des implémentations très basiques pour vous donner un exemple de ce type d'application. Nous aborderons dans un prochain article une application Web du chiffrement réversible.

 
[ Xavier Borderie JDNet
 
Accueil | Haut de page