Cryptographie!

Contrôle d'accès sous Unix

  Les mots de passe des utilisateurs ne sont pas stockés en clair sur une machine. Le procédé que l'on utilise en général est le suivant :
  • lors de l'initialisation du mot de passe $M$, ou lorsqu'un nouveau mot de passe est rentré, l'ordinateur calcule $h(M)$, où $h$ est une fonction à sens unique (on ne peut pas, connaissant $h(M)$, retrouver $M$). C'est cette valeur $h(M)$ qui est stockée dans le fichier à côté du nom d'utilisateur, on l'appelle l'empreinte du mot de passe.
  • lorsque l'utilisateur essaie de s'identifier avec le mot de passe $M'$, l'ordinateur calcule $h(M')$ et vérifie si cette valeur est bien égale à $h(M)$.
Pour que ceci fonctionne, il faut bien sûr que si l'on rentre deux mots de passe différents $M$ et $M'$, il soit impossible, ou au moins improbable, que $h(M)=h(M')$.

  En réalité, ceci est trop simpliste. En effet, imaginons que deux utilisateurs stockent le même mot de passe. Alors, la même valeur chiffrée $h(M)$ sera stockée dans le fichier d'identification : n'importe qui ayant accès au fichier saura que les deux utilisateurs utilisent le même mot de passe. Ceci pose au moins deux problèmes. D'une part, l'un des deux utilisateurs, sachant cela, pourra se connecter en se faisant passer pour l'autre utilisateur. D'autre part, un attaquant éventuel qui a constaté cela se dit qu'il y a de bonnes chances que, si deux utilisateurs différents ont choisi le même mot de passe, alors ce mot de passe est un nom commun. Ceci facilite grandement les attaques par dictionnaire.

  Pour cette raison, on utilise un procédé un petit plus compliqué. Au moment de la création du mot de passe, on ajoute une composante aléatoire à la génération de l'empreinte. Par exemple, on calcue $h(M,s)$, où $s$ est le nombre de secondes écoulées depuis le 1er janvier 2000, au moment de la création du mot de passe. Cette valeur $s$ s'appelle le sel, et elle est différente pour tous les utilisateurs. Ainsi, même si deux utilisateurs ont le même mot de passe, ces mots de passe auront des empreintes différentes car les sels utilisés seront différents. Le fichier des mots de passe contient maintenant pour chaque utilisateur à la fois le sel $s$ et l'empreinte $h(M,s)$. Lorsqu'un utilisateur s'identifie avec un mot de passe $M'$, l'ordinateur va calculer $h(M',s)$ ($s$ est stocké dans le fichier), et va le comparer à l'empreinte stockée $h(M,s)$.

  Venons-en maintenant à la gestion des mots de passe sous Unix, comme elle se faisait initialement. Le mot de passe était tronqué à 8 caractères, ce qui faisait un mot de passe de 56 bits. Un sel de 12 bits est généré de façon aléatoire, en utilisant l'horloge interne. La combinaison du mot de passe et du sel donne une clé $W$. Cette clé est alors utilisée pour l'algorithme DES. Concrètement, l'ordinateur part du mot nul $M_0$, et calcule $DES_W(M_0)=M_1$, c'est-à-dire qu'il applique l'algorithme DES au mot $M_0$ avec la clé $W$. Il recommence à partir de $M_0$, calculant $M_1=DES_W(M_0)$, et il répète l'opération 25 fois, jusqu'à calculer $M_{25}$. C'est cette valeur qui est l'empreinte du mot de passe!

  Pourquoi faire fonctionner 25 fois l'algorithme du DES, alors qu'une seule fois suffirait? La réponse est toute bête : cela permet de rendre l'algorithme 25 fois plus lent. Un humain rentrant son mot de passe ne s'en rend pas compte. Une machine essayant de trouver un mot de passe par la force brute, essayant donc tous les mots de passe possibles les uns à la suite des autres, devra attendre 25 fois plus longtemps pour essayer un nouveau mot de passe. C'est bien plus embêtant pour elle!