Bonne pratique pour les mots de passe: password_hash et password_verify
Sécurité des mots de passe
Un mot de passe ne devrait jamais se trouver dans une base de données, ou dans quelconque autre format de stockage de données.
Si la base de données est compromise, l'attaquant obtient immédiatement tous les mots de passe des utilisateurs !
Il faut que le mot de passe soit haché!
Ne pas confondre cryptage et hachage
Bien que les termes soient souvent confondus dans le langage courant, le hachage et le chiffrement (le terme rigoureux en français pour "cryptage") répondent à des problématiques de sécurité fondamentalement différentes
Hachage
Le hachage transforme une donnée de taille variable (une chaîne de caractères, un fichier) en une empreinte numérique de taille fixe (le hash). C'est une fonction mathématique irréversible : il est mathématiquement impossible de retrouver la donnée d'origine à partir du hash.
Cryptage
Nommé également Le Chiffrement (Encryption).
Le chiffrement sert à garantir la confidentialité. Il transforme une donnée lisible (le texte clair) en un format illisible (le texte chiffré). Contrairement au hachage, cette opération est réversible : on peut retrouver la donnée d'origine, à condition de posséder la bonne clé cryptographique.
Il faut donc hacher les mots de passe en PHP, un jeu d'enfant, mais il y a des règles à respecter!
Mauvaises pratiques
Une solution naïve consiste à utiliser une fonction de hachage classique :
Cependant, ces algorithmes sont aujourd'hui considérés comme insuffisants pour protéger des mots de passe.
Ils sont :
- Trop rapides.
- Vulnérables aux attaques par dictionnaire.
- Vulnérables aux tables arc-en-ciel (Rainbow Tables), Une table arc-en-ciel est une base de données précalculée massive qui permet de retrouver un mot de passe en clair à partir de son empreinte (le hash) de manière quasi instantanée
- Conçus pour l'intégrité des données et non pour le stockage des mots de passe.
Bonne pratique
Password_hash() est la méthode la plus moderne et solide pour hacher un mot de passe!
Documentation password_hash
Nous avons donc des haches différents avec le même mot de passe, PHP ne va pas vérifier si le mot de passe correspond au hache, mais si le hache a pu être généré depuis le mot de passe !