Cette section explique les raisons d'utiliser des fonctions de hashage pour les mots de passe, ainsi que la façon de le faire efficacement.
Le hashage de mot de passe est l'une des pratiques de sécurité les plus basiques qui doit être effectuée. Sans cela, chaque mot de passe stocké peut être volé si le support de stockage (typiquement une base de données) est compromis. Ce mot de passe peut alors être immédiatement utilisé pour accèder frauduleusement non seulement à votre application mais aussi sur d'autres applications si l'utilisateur utilise le même mot de passe ailleurs.
En appliquant un hashage sur le mot de passe avant de le stocker, 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 hashage 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.
Les algorithmes de hashage 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 hasher un mot de passe utilisateur.
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.
Il existe deux fonctions fournies dans PHP pour hasher avec des algorithmes précis.
La première fonction de hashage est crypt(), elle supporte nativement plusieurs algorithmes. Lorsque vous utilisez cette fonction, vous êtes sûr que l'algorithme que vous choisissez est disponible, car PHP en contient des implémentations natives dans le cas où votre système ne les supporterait pas.
La deuxième fonction de hashage est hash(), elle supporte beaucoup plus d'algorithmes et de variantes que crypt(), mais elle n'en supporte pas certains que crypt() supporte. L'extension Hash est fournie avec PHP, mais elle peut être désactivée à la compilation, ainsi il n'est pas certain qu'elle soit présente, alors que crypt() l'est obligatoirement.
L'algorithme recommandé pour hasher des mots de passe est Blowfish, car il est nettement plus coûteux en calcul que MD5 ou SHA1 pour être cassé, tout en restant évolutif.
Un grain de sel, en cryptographie, est appliqué durant le processus de hashage pour éliminer la possibilité d'attaques par dictionnaires (hashages enregistrés dans une grande liste et comparés).
En d'autres termes, un grain de sel est une petite donnée additionnelle qui renforce significativement la puissance du hashage pour le rendre beaucoup plus difficile à cracker. Il existe de nombreux services en ligne qui proposent de volumineux dictionnaires de mots de passe avec leur hash. L'utilisation d'un grain de sel rend ces dictionnaires inutiles.