Leçons de niveau 2

Mot de passe/Sécurité et mots de passe

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Début de la boite de navigation du chapitre
Sécurité et mots de passe
Icône de la faculté
Chapitre no 2
Leçon : Mot de passe
Chap. préc. :Les règles d'or
fin de la boite de navigation du chapitre
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « Mot de passe : Sécurité et mots de passe
Mot de passe/Sécurité et mots de passe
 », n'a pu être restituée correctement ci-dessus.

Introduction[modifier | modifier le wikicode]

La quasi totalité des sites utilisent des connexions par mot de passe, afin d'accéder à des espaces privés, par exemple. Avec les développements du web, de nouveaux criminels ont fait leur apparition. Un de leur passe-temps est d'usurper l'identité d'une personne, souvent prise au hasard, et ainsi de laisser libre cours à leur imagination et à leurs « talents ». Pour cela, ils vont utiliser des failles.

En tant que webmaster, vous vous devez d'assurer la sécurité de vos inscrits. Cela n’est pas très compliqué, et peut éviter bon nombre de problèmes. Il est préférable d’avoir quelques notions de programmation, mais tout sera fait pour vous simplifier la tâche.

Pour tous les exemples qui suivent, les technologies utilisées seront PHP/MySQL mais le principe s'applique à tout autre langage Web.

Protection par fonction de hachage[modifier | modifier le wikicode]

Dans le cas d'un service devant permettre l'identification de ses utilisateurs, nous devons utiliser un couple nom d'utilisateur/mot de passe. Cependant il est important qu'en cas de fuite des données, les mots de passe ne se retrouvent pas lisible. Nous devons donc stocker les mot de passe de façon a pouvoir les comparer à un mot de passe entrée par un utilisateur souhaitant se connecter, sans pour autant stocker se mot de passe. Pour cela, nous utilisons un algorithme de hachage, comme par exemple md5 ou sha. Ces algorithmes vont faire passer le mot de passe dans une fonction qui, donnera toujours le même résultat pour le même mot de passe, tout en rendant impossible de retrouver le mot originel. Ainsi le mot de passe est protéger et nous pouvons vérifier la connection de notre utilisateur.

Attaque par "Force Brut"[modifier | modifier le wikicode]

L'attaque de mot de passe par force brut, consiste a essayer tout les mot de passes possible jusqu’à trouver le bon mot de passe. Cela peut s'appliquer directement sur le hash d'un mot de passe, sur un logiciel ou sur un site internet.

Il y a différentes manière d'opérer une attaque par force brut :

  • Attaque brut : Toutes les combinaisons sont essayées, cela prend énormément de temps, mais on est certain de trouver le mot de passe.
  • Attaque par Dictionnaire : Touts les mots d'un dictionnaire sont essayés, le dictionnaire peut inclure des mots d'une langue mais également des mots de passe déjà trouvés.
  • Attaque par Rainbow Table: une base de données de hash existe, ils sont tous comparés pour trouver le mot de passe.

Différents logiciels permettent de pratiquer ces attaques, le plus connu est actuellement John the Ripper.

L'attaque "Man in the middle"[modifier | modifier le wikicode]

Cette attaque consiste à se placer entre un site web et l'utilisateur. Le pirate peut alors récupérer toutes les informations échangées entre ceux-ci, à l'aide d'un logiciel. Autrement dit, celui qui réussit une telle attaque peut alors récupérer les informations nécessaires pour se connecter au site avec le compte de l'utilisateur.

La protection la plus efficace est le chiffrement ou le hachage des données. Il existe de nombreuses fonctions pour réaliser ceci, tel que MD5, ou SHA. Prenons le code suivant, avec pour pseudo Test, et pour mot de passe "ok719!a+" :

$pseudo=$_POST['pseudo'];
$password=$_POST['passe'];

On aura donc une requête comme ceci :

SELECT * FROM utilisateurs WHERE pseudo='Test' AND passe='ok719!a+'

Le mot de passe transite donc en clair, quelle aubaine pour l'attaquant ! Le but est donc de rendre cette instruction illisible. On va alors créer une empreinte du mot de passe, grâce à MD5 et SHA. MD5 n'étant plus considéré comme sûr, il est à utiliser uniquement en complément de SHA, qui lui, est à privilégier.

$pseudo=$_POST['pseudo'];
$password=sha1($_POST['passe']);


Nous aurons alors la requête suivante :

SELECT * FROM utilisateurs WHERE pseudo="test" AND passe="f22bc54f2cf3f89bf3793e25845e092695059a68"


Si vous avez choisi un mot de passe suffisamment long, l'attaquant mettra alors beaucoup de temps, au minimum, à trouver votre mot de passe, ou une collision de celui-ci.

Maintenant imaginons que la personne n'aie pas suivi les conseils de la leçon précédente, et que son mot de passe soit "démocratie". L'attaque dictionnaire étant la plus rapide, même avec un long mot de passe, il ne tiendra que quelques minutes.

Pour protéger les éventuels mots de passe de ce genre, il y a une technique : l’utilisation de préfixes/suffixes dans les mots de passe. Le code :

$pseudo=$_POST['pseudo'];
$password=sha1($_POST['passe'].'préfffix007!');


Voila comment cacher le mot de passe de vos utilisateurs au reste du monde. Cela implique aussi de stocker les mots de passe hachés dans vos bases de données, rendant alors impossible la restitution de ceux-ci en cas de perte. Mais la sécurité n'a pas de prix, et ce n’est pas un véritable problème car les solutions sont nombreuses.

L'injection SQL[modifier | modifier le wikicode]

Cette technique consiste à modifier une requête envoyée à la base de données pour arriver à ses fins. Cela peut aller de l'usurpation d'identité à la destruction du contenu de la base de données. Cette faille est présente dès lors que les données entrées dans le formulaire sont utilisées en l'état.

Prenons l'exemple suivant, avec toujours la même valeur en pseudo et en mot de passe "ébé*1<43":

$pseudo=$_POST['pseudo'];
$password=$_POST['passe'];

La requête sera donc :

SELECT * FROM utilisateur WHERE pseudo="Test" AND passe="ébé*1<43"


Si le pseudo et le mot de passe sont envoyés dans la requête sans aucun traitement avec, par exemple, ce code :

$sql="SELECT * FROM utilisateurs WHERE pseudo='".$pseudo."' AND passe='".$password."'";


Il suffit alors d'envoyer comme mot de passe "' OR 1=1" pour que la requête ressemble à :

SELECT * FROM utilisateurs WHERE pseudo='Test' AND passe='' OR 1=1'


1=1 étant toujours vrai, l'utilisateur "Test" est donc maintenant connecté sans avoir eu besoin de son mot de passe. Heureusement, on peut éviter cela, grâce à la fonction mysql_real_escape_string(). Cette fonction échappe tous les caractères potentiellement dangereux avec un antislash ("\").

$pseudo=mysql_real_escape_string($_POST['pseudo']);
$password=mysql_real_escape_string($_POST['passe']);


Vous êtes à présent protégé des injections SQL, la requête ressemblant alors à ceci :

SELECT * FROM utilisateurs WHERE pseudo='Test' AND passe='\' OR 1=1'

Conclusion[modifier | modifier le wikicode]

Pour une sécurité "maximale", utilisez un script semblable à celui-ci :

$pseudo = mysql_real_escape_string($_POST['pseudo']);
$password = mysql_real_escape_string(sha1('préfixe'.md5($_POST['password']).'suffixe'));


Modifier le préfixe et le suffixe ne devrait pas poser trop de problèmes. Ce n'est absolument pas difficile à mettre en place et peut éviter bien des mésaventures.

Enfin, rappelez-vous de la règle d'or : Ne faites jamais confiance aux données extérieures à votre script.

Voir aussi[modifier | modifier le wikicode]

Liens externes[modifier | modifier le wikicode]