Aujourd’hui j’ai eu un cours qui m’a permis de comprendre ce que je n’avais jamais compris. Lorsque j’ai appris le PHP, on m’a dit : « il faut chiffrer les mots de passe de tes utilisateurs quand tu les enregistres dans une base de données ! ». Moi, docile, j’ai obéis ! (quoi, on me glisse dans l’oreillette que cela n’a rien à voir avec le chiffrement mais plutôt avec le hachtakage hashage ? Oui bon, on y vient !)
Cela paraît logique :
- lors de son inscription, l’utilisateur me fournit un mot de passe en clair (appelons-le Mclair),
- je le chiffre (il devient Mchiffré) et l’enregistre dans ma base de données,
- lorsque cet utilisateur veut se connecter, il me fournit un mot de passe en clair (appelons-le Tclair), je le chiffre (appelons-le Tchiffré) et teste s’il correspond au mot de passe chiffré de ma base de données (Tchiffré == Mchiffré ?)
Avec ce système, si quelqu’un accède à ma base de données, il ne lui servira à rien de lire les mots de passe de mes utilisateurs puisqu’ils sont sécurisés, il ne pourra donc pas se faire passer pour un de mes utilisateurs. C’est déjà suffisamment embêtant que quelqu’un ait réussi à s’introduire dans ma base de données !
Ce que je n’avais bien capté, c’est ce qui signifie chiffré un message et pourquoi on m’avait encouragé à utilisé la fonction de chiffrage « Md5 » alors que je lisais par ailleurs qu’il valait mieux utiliser « Sha-1 ». Aujourd’hui, je suis un homme nouveau qui voit le monde autrement et qui se couchera accessoirement légèrement moins bête ce soir.
Chiffrage ou hashage ?
En fait, ce que l’on veut ici, ce n’est pas chiffrer des données (ce qui supposerai qu’on aurait une clef permet de chiffrer et de déchiffrer. Dans notre cas, c’est inutile), mais les modifier de telle sorte que l’on puisse toujours les comparer aux données initiales, mais sans que personne ne puisse retrouver ces données initiales. C’est ce qu’on appelle le hashage.
Une fonction de hashage est indéchiffrable et a la particularité fort intéressante de donner un résultat différent pour chaque donnée que l’on essaye de hacher. Ainsi, « chat » et « chien » donneront un résultat différent après être passée par la même fonction de hashage.
C’est important, car quelqu’un pourrait usurper l’identité d’un utilisateur en utilisant un mot de passe qui n’est pas le bon mais qui, via une fonction de hashage, fournit le même résultat que le bon mot de passe. Heureusement, avec une bonne fonction de hachage ce n’est pas le cas !
Quand deux mot donne le même résultat via une fonction de hachage (« chat » et « chien » donne « fantôme » par exemple), on dit qu’il y a redondance ! Si on a détecté des faiblesses dans une fonction permettant de trouver des redondances, ou alors qu’un pays a suffisamment de puissance de calcul pour trouver des redondances en testant tous les mots existants, alors on dit que la fonction de hashage est cassée, il ne faut plus l’utiliser !
Quelles fonctions de hashage utiliser ?
MD5
Md5 fournit un résultat de 128 bits et elle a 2 inconvénients :
- En hachant 264 valeurs différentes, on arrive à trouver des collisions. Donc quelqu’un ayant une forte puissance de calcul peut réussir à usurper le mot de passe de quelqu’un d’autre ! (s’il veut cibler un utilisateur en particulier c’est par contre beaucoup plus difficile !)
- Des faiblesses mathématiques permettent d’aller encore plus vite !
Moralité : il ne faut plus utiliser Md5 comme fonction de hashage !
Voici tout de même comment l’utiliser en PHP :
$data = 'chat'; $datatHachee = md5($data);
SHA-1
Sha-1 a été inventé au moment ou on voyait venir les faiblesses de Md5, elle fournit un résultat de 160 bits et on arrive à trouver des collisions au bout de 280 tentatives. A terme (3-10 ans), ce sera insuffisant ! Il paraîtrait que des faiblesses de calcul ont été trouvé, mais il semble que les démonstrations soient un peu fumeuse…
Bref, les organismes de sécurité conseillent d’arrêter d’utiliser Sha-1.
Voici tout de même comment l’utiliser en PHP :
$data = 'chat'; $datatHachee = sha1($data);
SHA-2
Il existe Sha-256 (résultat sur 256 bits) et Sha-512 (résultat sur 512 bits) qui ont été normalisée il y a peu ! A utiliser l’un ou l’autre. Ces deux fonctions ont semble-t-il une longue vie devant elles ! Jusqu’à ce que quelqu’un trouve des failles, ou que l’avancée technologique fasse qu’il devient raisonnable de tester tout un tas de combinaisons dans une durée inférieure au temps qu’à mis la terre à se créer (si possible) !
Moralité : Sha-2 est la fonction de hachage à utiliser en ce moment !
En PHP, il était possible d’utiliser md5 et sha1 en utilisant les fonctions du même nom, mais pour utiliser Sha-2, il faut passer par la méthode hash
. Cette méthode prend en premier paramètre la fonction de hashage à utiliser, et en second la donnée à hacher. Le grand avantage et que l’on peut préparer l’arrivée de futures fonctions de hachage en passant la fonction à utiliser en paramètre.
// Dans un fichier de configuration define('FonctionDeHachage', 'sha512'); // Hachage $data = 'chat'; $datatHachee = hash(FonctionDeHachage, $data);
SHA-3
Sha-3 n’a pas encore été normalisée mais devrait arriver d’ici 2012 et on devrait donc voir rapidement les premières implémentations sur nos langages préférées !
Eh bien, l’écriture de cette article aura été plus périlleuse que prévue ! Je me rend compte qu’il est difficile d’expliquer simplement ces choses. Finalement, les détails ne sont pas si important, ce qui compte c’est d’avoir compris comment sécuriser les mots de passe de ses utilisateurs et pourquoi on agit ainsi.
Cet article est la première partie d’une série sur la sécurisation des mots de passe :
Ping : Le paradoxe des anniversaires - 30 minutes par jour
Ping : La sécurisation des mots de passe, c'est salée ! - 30 minutes par jour
Ping : La sécurisation des mots de passe et les poissons volants 30 minutes par jour