Un écureuil, un éléphant et un peu de sel

Le module change_sqlpass de Squirrelmail permet de modifier un mot de passe conservé dans une base PostgreSQL.

Lors du paramétrage de ce module, il faut avoir la réponse à une question très technique, qui risque de vous laisser pantois : comment déterminer de grain de sel (salt en anglais) utilisé dans vos mots de passe.

Un grain de sel ?

Un peu d'histoire. Sous les systèmes de type Unix, les mots de passe sont chiffrés avec un chiffrement non réversible (autrement dit, on ne peut pas retrouver votre mot de passe à partir de sa version chiffrée).

Lorsque vous vous connectez, on chiffre le mot de passe que vous entrez et on le compare au mot de passe officiel (déjà chiffré). Pas besoin donc de savoir le déchiffrer.

Cependant, cette méthode simple présente plusieurs inconvénients. Si deux utilisateurs ont le même mot de passe, cela sera immédiatement visible en regardant la table des mots de passe. De même, il est très simple d'effectuer une recherche systématique de mots de passe, en chiffrant un à un tous les mots d'un dictionnaire et en les comparant aux mots de passe de tous les utilisateurs.

Pour mitiger ces problèmes, on s'est résolu à ajouter un grain de sel aux mots de passe. Chaque utilisateur se voit attribuer un code différent (le grain de sel) qui modifie le mot de passe chiffré obtenu et est conservé avec le mot de passe.

Pour vérifier le mot de passe, on prend donc le mot de passe de l'utilisateur, le grain de sel lu sur le mot de passe enregistré, on les utilise pour recréer un mot de passe chiffré et on les compare au mot de passe chiffré enregistré.

Avantage, 2 utilisateurs avec les même mots de passe auront des mots de passe chiffrés différents. Et une recherche exhaustive de mots de passe devra maintenant se faire utilisateur par utilisateur, ce qui sera significativement plus long (enfin, en théorie. l’existence d'immenses tables de mots de passes pré-calculées relativisant un peu cet avantage).

Bon, concrètement, on fait quoi ?

Revenons à change_sqlpass. Dans le cas d'un mot de passe chiffré avec PHPCRYPT, le grain de sel se trouve dans les 2 premiers caractères du mot de passe. Il faut donc utiliser une requête comme celle-ci pour récupérer le grain de sel :

$csp_salt_static = '';
$csp_salt_query = "SELECT substr( mot_de_passe_chiffre, 1, 2 ) FROM table_utilisateur WHERE nom = '%2'";

Dans le cas d'un mot de passe condensé avec MD5, aucun grain de sel n'est utilisé :

$csp_salt_static = '';
$csp_salt_query = '';

Enfin, dans le cas d'un mot de passe chiffré avec MD5CRYPT, le format du mot de passe chiffré est : $1$gain_de_sel$mot_de_passe_chiffré. On peut dont récupérer le grain de sel avec une requête du type :

$csp_salt_static = '';
$csp_salt_query = "SELECT split_part( mot_de_passe_chiffre, '$', 3 ) FROM table_utilisateur WHERE nom = '%2'";

(Un petit correctif de documentation a été remonté à l'équipe Squirrelmail.)