Authentification à deux facteurs et bonnes pratiques de sécurité des mots de passe
Vous avez développé une application web et les utilisateurs s'inscrivent. Mais leurs comptes sont-ils vraiment sécurisés ? Les mots de passe faibles et l'absence d'authentification à deux facteurs (2FA) figurent parmi les moyens les plus simples pour les attaquants de s'introduire. Dans ce guide, nous allons passer en revue les bonnes pratiques intemporelles et concrètes pour la sécurité des mots de passe et la 2FA que vous pouvez mettre en œuvre dès aujourd'hui.
Pourquoi la sécurité des mots de passe reste importante
Malgré des années d'avertissements, les mots de passe restent la principale méthode d'authentification pour la plupart des applications web. Les attaquants le savent et ciblent les mots de passe via le phishing, le credential stuffing et la force brute. Un seul mot de passe compromis peut entraîner la prise de contrôle de compte, le vol de données et des dommages réputationnels.
Des politiques de mots de passe robustes et la 2FA augmentent considérablement la barre pour les attaquants. Voyons comment mettre en place correctement les deux.
Stockage des mots de passe : un hachage bien fait
Ne stockez jamais les mots de passe en clair. Hachez-les toujours avec un algorithme fort et lent conçu pour les mots de passe. Les hachages rapides comme SHA-256 ne conviennent pas car ils permettent des attaques par force brute rapides.
Algorithmes recommandés :
- Argon2id – Lauréat du Password Hashing Competition, résistant aux attaques par GPU et par canal auxiliaire.
- bcrypt – Largement pris en charge, éprouvé et lent par conception.
- scrypt – Gourmand en mémoire, efficace pour prévenir les attaques accélérées par matériel.
Exemple d'utilisation de bcrypt en Node.js :
const bcrypt = require('bcrypt');
const saltRounds = 12;
async function hashPassword(password) {
return await bcrypt.hash(password, saltRounds);
}
async function verifyPassword(password, hash) {
return await bcrypt.compare(password, hash);
}
Utilisez toujours un sel unique par mot de passe (la plupart des bibliothèques le gèrent automatiquement). Ajustez le facteur de coût pour que le hachage prenne ~100-500 ms sur votre serveur.
Politiques de mots de passe réellement utiles
Oubliez les règles complexes comme « doit contenir un symbole et un chiffre ». Les recommandations modernes (NIST SP 800-63B) préconisent :
- Longueur minimale de 8 caractères, mais encouragez les phrases de passe (par ex., 4 mots aléatoires ou plus).
- Vérifiez par rapport aux listes de mots de passe compromis (par ex., l'API Have I Been Pwned).
- Pas d'expiration périodique forcée sauf en cas de suspicion de compromission.
- Autorisez tous les caractères ASCII imprimables et les espaces.
- Limitez le débit des tentatives de connexion pour prévenir la force brute.
Implémentez un indicateur de force simple qui donne un retour sans bloquer les mots de passe légitimes.
Méthodes d'authentification à deux facteurs (2FA)
La 2FA ajoute un second facteur : quelque chose que vous possédez (téléphone, clé matérielle) ou quelque chose que vous êtes (biométrie). Voici les méthodes courantes, classées par sécurité :
| Méthode | Sécurité | Utilisabilité |
|---|---|---|
| Clés de sécurité matérielles (WebAuthn/FIDO2) | Élevée | Moyenne |
| Applications d'authentification (TOTP) | Élevée | Élevée |
| Notifications push | Moyenne | Élevée |
| Codes SMS | Faible | Élevée |
Le SMS est vulnérable au SIM swapping et à l'interception. Préférez TOTP ou WebAuthn lorsque c'est possible.
Mise en œuvre de la 2FA basée sur TOTP
TOTP (Time-based One-Time Password) offre un excellent équilibre entre sécurité et utilisabilité. Voici un flux de travail de haut niveau :
- Générez une clé secrète pour l'utilisateur (par ex., 32 octets aléatoires, encodés en base32).
- Créez une URI otpauth:// et affichez un QR code que l'utilisateur scanne avec une application d'authentification.
- Vérifiez que l'utilisateur peut générer un code valide avant d'activer la 2FA.
- Stockez le secret de manière sécurisée (chiffré au repos).
- Fournissez des codes de secours pour la récupération de compte.
Lors de la connexion, après avoir vérifié le mot de passe, demandez le code TOTP. Vérifiez-le avec une bibliothèque comme otplib ou speakeasy.
const { authenticator } = require('otplib');
// Generate secret
const secret = authenticator.generateSecret();
// Verify token
const isValid = authenticator.verify({ token: userToken, secret });
Autorisez une petite fenêtre temporelle (par ex., ±1 intervalle) pour tenir compte de la dérive d'horloge.
WebAuthn : l'avenir de l'authentification
WebAuthn (partie de FIDO2) permet une authentification sans mot de passe et à second facteur à l'aide de clés matérielles ou d'authentificateurs de plateforme (Touch ID, Windows Hello). Il est résistant au phishing car l'identifiant est lié à l'origine.
La mise en œuvre de WebAuthn nécessite :
- Génération et vérification de challenge côté serveur.
- JavaScript côté client utilisant l'API WebAuthn.
- Stockage des clés publiques et des identifiants d'identification pour chaque utilisateur.
Des bibliothèques comme SimpleWebAuthn facilitent la tâche. Bien que plus complexe que TOTP, WebAuthn offre la protection la plus forte.
Limitation de débit et verrouillage de compte
Même avec la 2FA, vous devez prévenir les attaques par force brute sur les mots de passe. Mettez en place :
- Limitation de débit par IP et par compte (par ex., 5 tentatives par minute).
- Retard exponentiel après des tentatives échouées.
- Verrouillage de compte après des échecs répétés, avec un processus de déverrouillage sécurisé (par ex., vérification par e-mail).
- CAPTCHA après quelques échecs.
Veillez à ne pas verrouiller définitivement les utilisateurs légitimes ; utilisez des verrouillages temporaires et informez l'utilisateur.
Réinitialisation sécurisée du mot de passe
Les flux de réinitialisation de mot de passe sont un vecteur d'attaque courant. Suivez ces règles :
- Utilisez un jeton à usage unique et limité dans le temps envoyé par e-mail.
- Ne révélez pas si une adresse e-mail existe dans le système.
- Exigez que l'utilisateur se réauthentifie s'il est déjà connecté.
- Invalidez toutes les sessions après une réinitialisation de mot de passe.
Sensibiliser les utilisateurs sans les blâmer
La sécurité est une responsabilité partagée. Fournissez des conseils clairs :
- Utilisez un gestionnaire de mots de passe pour générer et stocker des mots de passe uniques.
- Activez la 2FA partout où c'est possible.
- Méfiez-vous des tentatives de phishing.
Des astuces intégrées et une page dédiée à la sécurité peuvent aider.
FAQ
La 2FA par SMS est-elle meilleure que pas de 2FA du tout ?
Oui, la 2FA par SMS vaut mieux que rien, mais elle est vulnérable au SIM swapping et à l'interception. Préférez TOTP ou WebAuthn pour une sécurité renforcée.
À quelle fréquence dois-je changer d'algorithme de hachage de mot de passe ?
Vous n'avez pas besoin de changer sauf si une vulnérabilité est découverte. Cependant, vous pouvez rehacher les mots de passe lors d'une connexion réussie lorsque vous mettez à jour les paramètres (par ex., augmenter le coût de bcrypt).
Puis-je utiliser la 2FA avec OAuth ou une connexion sociale ?
Oui, mais la 2FA est généralement gérée par le fournisseur d'identité. Si vous utilisez une connexion sociale, assurez-vous que votre propre processus de récupération de compte est sécurisé.
Prêt à renforcer la sécurité de votre application ? Commencez par mettre en œuvre un hachage robuste des mots de passe et la 2FA basée sur TOTP dès aujourd'hui. Pour plus d'outils de développement, consultez notre JSON Formatter pour déboguer rapidement les réponses d'API.