Le processus de vérification du mot de passe d'un utilisateur comporte plusieurs étapes, se concentrant sur les meilleures pratiques de sécurité plutôt que sur le stockage du mot de passe en texte brut. Voici un aperçu de la façon dont cela fonctionne généralement :
1. Stockage des mots de passe (de la bonne manière) :
* Hachage : Au lieu de stocker directement le mot de passe de l'utilisateur, le système stocke un *hachage* cryptographique du mot de passe. Un hachage est une fonction à sens unique ; il est facile de calculer le hachage à partir du mot de passe, mais pratiquement impossible de déduire le mot de passe original à partir du hachage.
* Salage : Pour améliorer encore la sécurité, un *sel* aléatoire est ajouté au mot de passe avant le hachage. Le sel est une chaîne de caractères unique, générée de manière aléatoire. Cela rend beaucoup plus difficile pour les attaquants d'utiliser des tables de hachage précalculées (tables arc-en-ciel) pour déchiffrer les mots de passe, même s'ils accèdent à la base de données.
* Le « sel » est généralement stocké à côté du « hachage » du mot de passe dans le dossier de l'utilisateur.
* Algorithmes de hachage puissants : Les systèmes modernes utilisent des algorithmes de hachage robustes tels que :
* bcrypt : Algorithme de hachage adaptatif lent et coûteux en termes de calcul, ce qui le rend très résistant aux attaques par force brute. Cela inclut la génération et le stockage de sel dans le hachage lui-même.
* Argon2 : Un algorithme de hachage plus moderne et gourmand en mémoire, souvent considéré comme le successeur de bcrypt.
* crypt : Une autre fonction de dérivation de clé conçue pour nécessiter beaucoup de calculs, ce qui rend plus difficile le déchiffrement des mots de passe.
2. Processus de connexion/authentification :
1. Entrée utilisateur : L'utilisateur saisit son nom d'utilisateur et son mot de passe dans le formulaire de connexion.
2. Récupérer du sel : Le système récupère le *sel* associé au nom d'utilisateur saisi dans la base de données des utilisateurs.
3. Hachage avec du sel : Le système prend le mot de passe saisi par l'utilisateur et le *sel* récupéré, les combine, puis applique le même algorithme de hachage que celui utilisé lorsque le mot de passe a été initialement stocké.
4. Comparaison : Le hachage résultant de l'étape 3 est comparé au hachage du mot de passe stocké pour cet utilisateur dans la base de données.
5. Vérification :
* Si les deux hachages correspondent : Il est fort probable que l'utilisateur ait saisi le bon mot de passe. L'utilisateur est authentifié et une session est établie.
* Si les hachages ne correspondent pas : Le mot de passe saisi est incorrect. L'utilisateur se voit refuser l'accès et reçoit généralement un message d'erreur.
Pourquoi c'est sécurisé :
* Aucun mot de passe en texte brut : Le système ne stocke *jamais* le mot de passe réel en texte brut, donc même si la base de données est compromise, les attaquants n'auront pas d'accès direct aux mots de passe.
* Le sel empêche les attaques de la table arc-en-ciel : Le sel unique pour chaque utilisateur rend les tables arc-en-ciel (tables de hachage pré-calculées) inefficaces. Un attaquant devrait générer une table arc-en-ciel pour *chaque* sel, ce qui est prohibitif sur le plan informatique.
* Le hachage lent empêche les attaques par force brute : Les algorithmes de hachage modernes (comme bcrypt, Argon2 et scrypt) sont délibérément conçus pour être lents. Cela signifie qu’un attaquant ne peut pas essayer rapidement un grand nombre de mots de passe.
Exemple de code (conceptuel - Python avec bcrypt) :
```python
importer bcrypt
def hash_password(mot de passe) :
"""Hache un mot de passe en utilisant bcrypt avec un sel généré aléatoirement."""
# Générer un sel
sel =bcrypt.gensalt()
# Hachez le mot de passe en utilisant le sel
hasshed_password =bcrypt.hashpw(password.encode('utf-8'), sel)
return hasshed_password, salt #Renvoie à la fois le hachage et le sel afin que le sel puisse être stocké avec le hachage
def verify_password (entéré_password, stocké_hash, stocké_salt) :
"""Vérifie si le mot de passe saisi correspond au hachage stocké."""
# Hachez le mot de passe saisi avec le sel stocké
hasshed_enter_password =bcrypt.hashpw (entered_password.encode ('utf-8'), stocké_salt)
# Comparez le hachage généré avec le hachage stocké
return hasshed_enter_password ==store_hash
Exemple d'utilisation (lors de la création d'un nouvel utilisateur) :
mot de passe ="monSecretPassword123"
hashed_password, salt =hash_password(mot de passe)
Stocker le mot de passe haché et le sel dans la base de données (associée à l'utilisateur)
Exemple d'utilisation (lors de la connexion) :
enter_password ="mySecretPassword123" #L'utilisateur fournit lors de la connexion
Récupérez le hash_stocké et le sel_stocké de la base de données en fonction du nom d'utilisateur
store_hash =b'$2b$12$eK11wE0GqJ8dK9j7cQh9yOC9/s8/6rXlG13N/L604qG1V14k6yDna' # Exemple - stocké par le haut
store_salt =b'$2b$12$eK11wE0GqJ8dK9j7cQh9yO' # Exemple - stocké par le haut
si verify_password (entéré_password, stocké_hash, stocké_salt) :
print("Mot de passe vérifié ! Connexion réussie.")
autre:
print("Mot de passe incorrect. Échec de la connexion.")
```
Considérations importantes :
* Complexité du mot de passe : Appliquez des règles de complexité des mots de passe (longueur minimale, caractères requis) pour rendre les mots de passe plus difficiles à deviner.
* Limitation du débit : Implémentez une limitation du débit sur les tentatives de connexion pour empêcher les attaques par force brute. Verrouillez les comptes après un certain nombre de tentatives infructueuses.
* Authentification à deux facteurs (2FA) : Utilisez 2FA pour une couche de sécurité supplémentaire. Même si le mot de passe est compromis, un attaquant aura toujours besoin d'un deuxième facteur (par exemple, un code provenant d'une application mobile).
* Audits de sécurité réguliers : Effectuer des audits de sécurité réguliers pour identifier et corriger les vulnérabilités potentielles.
* Garder les bibliothèques à jour : Gardez les bibliothèques de hachage et les dépendances à jour pour bénéficier des derniers correctifs de sécurité.
* Mécanismes de réinitialisation du mot de passe : Mettez en œuvre des mécanismes sécurisés de réinitialisation de mot de passe à l’aide d’une vérification par courrier électronique ou de questions de sécurité.
En utilisant ces principes, les systèmes peuvent vérifier efficacement les mots de passe tout en protégeant les données des utilisateurs contre toute compromission. C'est un aspect crucial de la sécurité globale.
|