Hum ? Oui, je sais, le titre est pour le moins crypté…
Mais la purée en flocon salée est la méthode utilisée par Frédéric de Villamil pour nous expliquer, fort simplement, ce qu’est un algorithme de hashage et l’intérêt d’y ajouter une clef.
Le point de départ de l’explication est le piratage chez Linkedin de 6.5 millions de mots de passe chiffrés. Chose qui n’est a priori pas grave puisque les mots de passe sont cryptés.
Mais, car ils sont cryptés de façon simple, il est facile de les décrypter.
Un peu comme quand on fait de la purée en flocons (voir l’explication détaillée sur le site de Frédéric de Villamil, le hack des mots de passe de Linkedin expliqué à ma mère). A partir de la purée, on ne peut pas retrouver les flocons. Mais si on a tous les flocons de toutes les marques, il suffit de suivre chaque recette pour avoir la même purée.
Sauf bien sûr d’y ajouter sa touche personnelle, son grain de sel (et la quantité précise de sel nous reste secrète). C’est pas parce que c’est tout fait qu’il ne faut rien faire, diraient certains.
En gros, si on considère que les mots de passe sont encodé avec un md5, selon la syntaxe PHP de base :
<?php $mdp = md5('vache') ; ?>
on obtient 530ea9290fe68c4e83ee1427d0437902
.
A partir de cela, on ne peut pas savoir que c’est vache, donc le mot de passe est sécurisé.
Mais si on prend tous les mots du dictionnaire et qu’on les encode un par un et que l’on compare (on applique la recette de la purée), on finira par tomber sur 530ea… et donc sur vache.
Bien sûr, faire ça est long. Mais les pirates ont a leur disposition des Rainbow Tables, c’est à dire des bases de données où tous les mots du dictionnaire sont déjà stockés, avec leur équivalent encodé avec les outils standards. Il suffit alors de chercher 530ea… pour tomber sur vache instantanément.
Pour protéger un peu plus (ce qu’a omis Linkedin semble-t-il), plusieurs solutions (que l’on peut cumuler).
La première, rarement appliquée et pourtant simple, consisterait pour le service à refuser les mots de passe qui sont dans le dictionnaire, forçant ainsi l’utilisateur a se sécuriser lui même un minimum (un peu plus lourde techniquement à mettre en place, mais les gros sites comme Linkedin peuvent se le permettre).
On peut aussi imposer qu’un mot de passe soit composé d’un mélange de lettres / chiffres / caractères spéciaux. Voir par exemple sur PasswordFinder.fr l’article testeur de mots de passe de Microsoft ou un bon mot de passe ?.
Enfin, la solution qui devrait être systématique, consiste à rajouter ce que l’on appelle un grain de sel (salt, autrement appelé graine – seed), c’est à dire un mot magique connu du service qui serait accolé à tous les mots de passe du service avant d’être stocké.
Et ainsi empêcher que le mot de passe crypté soit dans un dictionnaire.
Compliqué techniquement ?
En supposant que notre grain de sel soit BFAGNFV0Uz9QOQFm
(on peut faire plus simple, mais autant se faire plaisir), la syntaxe PHP devient :
<?php $mdp = md5('vache' . 'BFAGNFV0Uz9QOQFm') ; ?>
on obtient 7232e53da40a023afe8d0c851f0dce32
.
Qui lui ne correspond à aucun mot du dictionnaire.
On s’arrangera pour que le grain de sel soit évidement le moins facile à deviner… et protéger dans un recoin de la configuration du système. Certains ajoutent le grain de sel avant le mot, voir un avant un après… Chacun sa recette, chacun son mot!
En attendant, changez votre mot de passe Linkedin (et changez vos mots de passe de temps en temps…).