Hachage des mots de passe de manière sûre et sécurisée

Cette section explique les raisons d'utiliser des fonctions de hachage pour les mots de passe, ainsi que la façon de le faire efficacement.

Pourquoi devrais-je hacher les mots de passe envoyés par les utilisateurs de mon application ?

Le hachage des mots de passe est l'une des considérations de sécurité les plus élémentaires qui doivent être prises lors de la conception de toute application ou service qui accepte des mots de passe des utilisateurs. Sans hachage, tout mot de passe stocké peut être volé si le stockage de données est compromis, et être immédiatement utilisé pour compromettre non seulement l'application ou le service, mais aussi les comptes des utilisateurs sur d'autres services, s'ils n'utilisent pas des mots de pass uniques.

En appliquant un hachage sur le mot de passe, vous rendez la tâche d'un attaquant très difficile pour connaitre le mot de passe original, et vous avez toujours la possibilité de comparer le mot de passe hashé à une chaîne reçue.

Il est important de noter que le hachage ne fait que protéger les mots de passe dans la base, pas leur éventuelle interception alors qu'ils sont envoyés à l'application par l'utilisateur, via du code malicieux injecté dans l'application, par exemple.

Pourquoi les fonctions traditionnelles de hachage comme md5() et sha1() sont-elles inappropriées aux mots de passe ?

Les algorithmes de hachage comme MD5, SHA1 et SHA256 sont destinés à être rapides et efficaces. Avec les équipements informatiques modernes, il est devenu facile d'attaquer par force brute la sortie de ces algorithmes pour retrouver la chaîne originale.

C'est la raison pour laquelle de nombreux experts en sécurité considèrent ces algorithmes comme faibles et les déconseillent fortement pour hacher un mot de passe utilisateur.

Comment les mots de passe doivent-ils être hachés, si les fonctions de hachage courantes ne sont pas adaptées ?

Lorsqu'on hashe des mots de passe, les deux considérations les plus importantes sont le temps de traitement, et le grain de sel. Plus la puissance de traitement requise est élevée, plus il faudra du temps pour casser le mot de passe en analysant sa sortie.

PHP fournit une API native de hachage de mot de passe qui gère à la fois le hachage et la vérification de mots de passe, le tout, de manière totalement sécurisée.

L'algorithme suggéré à utiliser pour le hachage de mots de passe est Blowfish, qui est aussi l'algorithme par défaut de l'API de hachage de mots de passe, sachant qu'il est significativement plus gourmand en calcul que MD5 ou SHA1, mais plus évolutif.

La fonction crypt() est également disponible pour le hachage des mots de passe, mais elle n'est recommandée que pour l'interopérabilité avec d'autres systèmes. Il est plutôt fortement conseillé d'utiliser l' API native de hachage des mots de passe dès que possible.

Qu'est ce que le grain de sel ?

Un grain de sel, ou "salt", en cryptographie, est appliqué durant le processus de hachage pour éliminer la possibilité d'attaques par dictionnaires (hachages enregistrés dans une grande liste et comparés).

En termes plus simples, un sel est une donnée supplémentaire qui rend les hachages beaucoup plus difficiles à casser. Il existe plusieurs services en ligne qui fournissent des listes étendues de hachages pré-calculés, ainsi que l'entrée d'origine de ces hachages. L'utilisation d'un sel rend improbable ou impossible de trouver le hachage correspondant dans l'une de ces listes.

password_hash() va créer un salt aléatoire si vous n'en fournissez pas, et c'est généralement la façon la plus sécurisée et la plus simple.

Comment sont stocker les salts ?

Lors de l'utilisation de la fonction password_hash() ou de la fonction crypt(), la valeur retournée inclue le salt comme parti du hash généré. Cette valeur devrait être stockée telle quelle dans la base de données, sachant qu'elle inclue les informations sur la fonction de hachage utilisée et peut donc être fournie directement à la fonction password_verify() ou la fonction crypt() lors de la vérification des mots de passe.

Avertissement

password_verify() doit toujours être utilisé au lieu de rehacher et comparer le résultat à un hachage stocké afin d'éviter les attaques par chronométrage.

Le diagramme suivant montre le format d'une valeur retournée de la fonction crypt() ou password_hash(). Comme on peut le voir, tout est présent, comme toutes les informations sur l'algorithme et le salt nécessaires pour une future vérification de mots de passe.


        Les composants de la valeur retournée par la fonction password_hash et crypt :
        dans l'ordre, l'algorithme choisi, les options de l'algorithme, le salt utilisé,
        et le mot de passe hashé.