Vérifier la solidité d'un mot de passe en PHP

MathieuGut

À l'heure où la sécurité sur internet est un sujet sensible et face à l'augmentation des actes de piratages, exiger un mot de passe 'solide' permet d'éviter quelques mauvaises surprises...
Complexité de l'article : Débutant

- Titre : Vérifier la solidité d'un mot de passe en PHP

- Auteur : MathieuGut

- Parution : 26 mars 2009

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2008 Mathieu Gut. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1.Problématique

- 2.Enjeux et choix techniques

- 3.Code

- 4.Conclusion

- 5.Remerciements

1.Problématique

Lorsque l'on propose un espace membre sur son site, la moindre des choses est d'assurer la sécurité des données de chacun.
A une époque où l'utilisation d'un mot de passe de connexion est largement répandue, il est nécessaire d'exiger un mot de passe dit 'solide' pour notamment pallier aux différentes techniques de piratages, le BruteForce par exemple, et ainsi d'éviter tous désagréments ayant pour cause un mot de passe trop simpliste...

Niveau sécurité, le risque zero n'existe pas. Cet article a seulement pour but de fournir un bouclier de plus face aux menaçes permanentes.
FAQ Sécurité PHP

2.Enjeux et choix techniques

L'enjeu majeur d'un système de vérification de la complexité d'un mot de passe est d'assurer un maximum de sécurité au niveau du choix fait par l'utilisateur.

Nous allons donc créer une fonction qui va nous renvoyer un indice de 'solidité', lequel nous permettra de juger, après comparaison, si le mot de passe est valable...

Pour la création de cette fonction nous allons avoir besoin d'une fonction PHP :

- La fonction strlen() pour calculer la longueur d'une chaîne.

Voici les différentes étapes qui vont composer notre fonction :

1. Récupération du mot de passe passé en paramètre.

2. Calcul de l'indice de solidité.

3. La fonction retourne un entier numérique.

La procédure de calcul de l'indice se déroule en plusieurs étapes, tout d'abord on découpe le mot de passe de façon à lire tous les caractères un par un (à l'aide de la structure for).
Chaque lettre minuscule rapporte 1 point, une lettre majuscule rapporte 2 points, 3 points pour les chiffres et 5 points pour les caractères autres.
De plus pour chaque type de caractères présents au moins une fois on ajoute des points de diversités. Enfin, le nombre de point est multiplié par le nombre de points de diversité, cela nous donne le nombre de points de complexité. Il ne nous reste plus qu'à comparer ce nombre au nombre minimum requis.

3.Code

Les codes présentés ci-dessous sont à titre d'exemples. Pour éviter toute erreur, ils ne doivent pas être Copiés/Collés. À vous d'adapter les exemples à votre situation...

La fonction testpassword()

<?php

function testpassword($mdp)    { // $mdp le mot de passe passé en paramètre

// On récupère la longueur du mot de passe
$longueur = strlen($mdp);

// On fait une boucle pour lire chaque lettre
for($i = 0; $i < $longueur; $i++)     {

// On sélectionne une à une chaque lettre
// $i étant à 0 lors du premier passage de la boucle
$lettre = $mdp[$i];

if ($lettre>='a' && $lettre<='z'){
// On ajoute 1 point pour une minuscule
$point = $point + 1;

// On rajoute le bonus pour une minuscule
$point_min = 1;
}
else if ($lettre>='A' && $lettre <='Z'){
// On ajoute 2 points pour une majuscule
$point = $point + 2;

// On rajoute le bonus pour une majuscule
$point_maj = 2;
}
else if ($lettre>='0' && $lettre<='9'){
// On ajoute 3 points pour un chiffre
$point = $point + 3;

// On rajoute le bonus pour un chiffre
$point_chiffre = 3;
}
else {
// On ajoute 5 points pour un caractère autre
$point = $point + 5;

// On rajoute le bonus pour un caractère autre
$point_caracteres = 5;
}
}

// Calcul du coefficient points/longueur
$etape1 = $point / $longueur;

// Calcul du coefficient de la diversité des types de caractères...
$etape2 = $point_min + $point_maj + $point_chiffre + $point_caracteres;

// Multiplication du coefficient de diversité avec celui de la longueur
$resultat = $etape1 * $etape2;

// Multiplication du résultat par la longueur de la chaîne
$final = $resultat * $longueur;

return $final;

}

Exemple d'utilisation de la fonction avec le mot de passe : mathieu7

Exemple #1

$mdp = "mathieu7";

$indice = testpassword($mdp);

echo $indice; // Retourne un indice de 40

Exemple d'utilisation de la fonction avec le mot de passe : MaThIeU7

Exemple #2

$mdp = "MaThIeU7";

$indice = testpassword($mdp);

echo $indice; // Retourne un indice de 84

Exemple d'utilisation de la fonction avec le mot de passe : MaTh!eU7

Exemple #3

$mdp = "MaTh!eU7";

$indice = testpassword($mdp);

echo $indice; // Retourne un indice de 187

Grâce à ces exemples on peut imaginer un mot de passe de complexité moyenne ayant pour valeur un indice d'environ 100.
A vous de juger et de définir un indice minimum requis en fonction de vos besoins.

Maintenant il ne vous reste plus qu'à utiliser cette fonction lors de la vérification des données d'inscriptions d'un membre par exemple, de faire une comparaison avec l'indice minimum, dont vous aurez défini la valeur, et de confirmer ou non la validité du mot de passe.

4.Conclusion

Cet article touche à sa fin, sachez que les exemples de codes sont à titre d'exemples et ne peuvent fonctionner par un simple Copier/Coller.
À vous de les adapter en fonction de vos besoins...

Cet exemple de contrôle des données est une manière simple et compréhensible de faire, ce n'est pas une finalité en soi mais seulement une mesure supplementaire dans la sécurisation des données...

Expressions régulières en PHP (Regex, un autre moyen de contrôle des données)

5.Remerciements

Merci à Yogui pour les corrections apportées à l'article.