Grain de sel

Hash

Technique du grain de sel

Cette technique est notamment utilisée par UNIX et permet de se protéger en cas de vol du hash md5. Comme une même chaîne donne toujours le même hash avec md5, si on chiffrait tous les mots de passe probables avec md5 (ou au moins un très grand nombre) on pourrait à partir d'un hash retrouver le mot de passe en clair. La constitution d'un tel dictionnaire prend du temps et doit être faite à l'avance, toutefois elle est envisageable. La parade se fait par l'introduction d'un grain de sel qui va "déformer" le hash. Ce grain de sel est en fait un très grand nombre que l'on concatène au mot de passe avant de le chiffrer, mais un exemple éclairera tout :

     $motDePasse = "toto"; $hash = md5($motDePasse);

$hash contient alors f71dbe52628a3f83a77ab494817525c6 qui est le hash de toto. Si l'on avait un dictionnaire avec tous les hashs possibles, on pourrait alors associer f71dbe52628a3f83a77ab494817525c6 à toto et donc avoir le mot de passe.

Maintenant, voilà une application du grain de sel : (on utilise la fonction rand(), qui créée un nombre aléatoire de 10 chiffres)

     $motDePasse = "toto"; $grainDeSel = rand(); $hash = md5($motDePasse.$grainDeSel);

$grainDeSel n'est pas secret, est propre à chaque utilisateur et est stocké en clair dans la base de données. Pour retrouver $motDePasse à partir de $hash, il faudrait donc maintenant un dictionnaire de tous les mots de passe possibles, concaténés avec $grainDeSel. Nous avons déjà dit que la réalisation d'un dictionnaire doit être faite à l'avance, c'est à dire à un moment où on ne connait pas $grainDeSel. Il faudrait donc réaliser un dictionnaire pour chaque grain de sel possible, ce qui est inenvisageable

Pour contrer cette technique, des logiciels prenant en compte les grain de sel ont été inventé. Ils sont en mesure de prendre en compte des techniques assez complexes comme l'algorithme de la fonction 'crypt' de PHP (MD5(hex(MD5(pass))) hash de la forme hexadécimale du hash du mot de passe), ou dîtes MD5MDS (MD5(MD5(pass).salt) hash du hash du mot de passe concaténé à un grain de sel).

Pour contrer la réalisation d'un brute force tenant compte d'un grain de sel, nous avons créé notre propre technique de grain de sel, en complexifiant le principe initial : L'algorithme devient :

     $MotDePasse = "toto"; $GrainDeSel = rand(); $hash = md5(md5($GrainDeSel.$MotDePasse).md5($GrainDeSel.$GrainDeSel));

Une petite démonstration vaut mieux qu'un long discours, donc voilà la page PHP de test pour les grains de sel.