SQL MD5()

Dans le langage SQL, la fonction MD5() permet de chiffrer une chaîne de caractère en un entier hexadécimal de 32 caractères. Cette chaîne de retour peut être particulière utile pour être utilisé comme clé de hashage.

A noter : la fonction MD5() utilise l’algorithme RSA (cf. « RSA Data Security, Inc. MD5 Message-Digest Algorithm »).

Syntaxe

La fonction s’utilise dans une requête SQL de la manière suivante :

SELECT MD5('test');

Une telle requête retournera la chaîne suivante :

098f6bcd4621d373cade4e832627b4f6

Cet exemple concret montre bien l’intérêt d’utiliser MD5() pour créer une clé de hashage.

Exemple

Pour comprendre le fonctionnement de cette fonction nous allons voir quelques exemples possibles de scénario où la fonction sera utile. Ces exemples sont purement fictifs et ne représentent pas une façon de procéder pour sécuriser une application. A titre d’exemple, il existe des banques de données qui permettent de retrouver potentiellement une chaîne à partir du chiffrage MD5(). Dès lors, cette fonction n’est pas une fonction de cryptographie sûre pour stocker « proprement » des mots de passe.

Créer une clé pour un utilisateur

Imaginons une application qui possède des comptes utilisateurs. Lors de l’inscription l’utilisateur doit valider son adresse email en cliquant sur un lien qui ressemble à ceci :

http://www.example.com/valider-email.php?utilisateur=345

Utiliser une telle méthode est dangereuse car n’importe qui peut juste modifier l’identifiant manuellement pour valider des comptes utilisateurs. Autrement dit, avec un niveau de sécurité si faible, vous pouvez facilement essayez toutes les combinaisons possible en remplaçant le « 345 » de l’URL pour valider des comptes qui ne sont pas à vous.

Pour améliorer un peu la sécurité, il est possible de générer une clé de hashage pour chaque utilisateur et de valider l’adresse email que si l’URL visitée contient les 2 paramètres suivants : l’identifiant ET la clé de hashage correcte (c’est-à-dire la clé de hashage qui correspond à l’identifiant).

http://www.example.com/valider-email.php?utilisateur=345&hashage=098f6bcd4621d373cade4e832627b4f6

De cette façon les personnes mal intentionnées ne pourront pas effectuer des tâches critiques à des comptes qui ne leurs correspondent pas.

Pour générer une clé de hashage unique c’est relativement simple. Il est possible par exemple d’utiliser comme clé d’entrée une combinaison de l’identifiant + la date + l’heure + un mot quelconque. Ainsi, il sera très compliqué pour un pirate informatique d’essayer de trouver la bonne combinaison pour valider un email. Voici l’exemple de façon concrète :

UPDATE utilisateur
SET hashage = MD5('345_2013-10-04 22:16:45_moutarde')
WHERE id = 345

Cette requête va ajouter une clé de hashage à l’utilisateur ayant l’identifiant 345.

Mettre a jour un mot de passe en MD5

Juste pour les besoins de ce tutoriel, nous allons considérer qu’un mot de passe d’une application est stocké en utilisant la fonction MD5(). Dans de telles circonstance, il est possible de mettre a jour un mot de passe en utilisant une requête SQL semblable à la requête ci-dessous:

UPDATE utilisateur
SET password = MD5('nouveau_mot_de_passe')
WHERE id = 39;

Rappel : une telle méthode ne permet pas de bien se protéger des attaques informatiques.

Vérifier l’identifiant et le mot de passe d’un utilisateur

Ce nouvel exemple utilise encore une fois l’exemple où le mot de passe est enregistré via la fonction MD5(). Si l’utilisateur souhaite se connecter en utilisant sont login et son mot de passe, l’application pourra vérifier la bonne combinaison en utilisant la requête ci-dessous:

SELECT id
FROM utilisateur
WHERE login = 'alphonse' AND password = MD5('secret');

Le résultat de cette requête est simple :

  • Si cette requête retourne un identifiant, ce sera l’identifiant de l’utilisateur qui possède la bonne combinaison de login et mot de passe
  • Si la requête ne retourne aucun résultat, cela signifie que le login ou le mot de passe ne correspond à aucune combinaison existantes dans la table utilisateur

Améliorer un peu la sécurité avec un préfixe et/ou suffixe

Comme cela a été expliqué, les exemples données ci-dessus sont purement fictifs et ne sont pas recommandés pour une application sécurisé. Il existe des banques de données qui permettent de rechercher une potentielle clé à partir de son hashage MD5. Pour stocker un mot de passe il est préférable d’utiliser la fonction SHA1().

Toutefois, il est tout de même possible d’utiliser la fonction MD() en combinant un préfixe et un suffixe à la clé d’entré utilisée par la fonction. Cela permet de complexifier un peu le chiffrement pour que ce soit plus difficile de deviner la clé de départ. Le préfixe et le suffixe ne doivent pas être divulgué pour conservé une bonne sécurité.

Dans notre exemple nous allons imaginer que le préfixe sera la chaîne de caractère « GIRAFE » tandis que le suffixe sera « TENNIS ».

Requête pour mettre a jour le mot de passe :

UPDATE utilisateur
SET password = MD5('GIRAFEnouveau_mot_de_passeTENNIS')
WHERE id = 39;

Requête pour vérifier le login + mot de passe :

SELECT id
FROM utilisateur
WHERE login = 'alphonse' AND password = MD5('GIRAFEsecretTENNIS');

Cette méthode est préférable et améliore un tant soit peu la sécurité d’une application.

Partager