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.
|