bcrypt
Fonction de hachage cryptographique adaptative conçue pour sécuriser le stockage des mots de passe avec protection contre les attaques par force brute.
Mis à jour le 13 janvier 2026
bcrypt est une fonction de hachage cryptographique spécifiquement conçue pour le stockage sécurisé des mots de passe. Basée sur l'algorithme de chiffrement Blowfish, elle intègre un mécanisme de salt automatique et un facteur de coût configurable qui ralentit intentionnellement le processus de hachage pour contrer les attaques par force brute. Développée en 1999 par Niels Provos et David Mazières, bcrypt reste l'une des solutions les plus recommandées pour la protection des credentials utilisateurs.
Fondements techniques
- Algorithme basé sur Blowfish avec génération automatique d'un salt aléatoire de 128 bits pour chaque mot de passe
- Facteur de coût (work factor) configurable permettant d'augmenter progressivement la complexité de calcul avec l'évolution du matériel
- Architecture adaptative rendant le hachage intentionnellement lent (entre 50ms et 1s selon le facteur de coût) pour ralentir les attaques
- Format de sortie standardisé encodant le salt, le facteur de coût et le hash dans une chaîne unique facilitant la vérification
Avantages sécuritaires
- Protection native contre les attaques rainbow tables grâce au salt unique par mot de passe
- Résistance aux attaques par force brute via le ralentissement configurable du calcul
- Évolutivité du niveau de sécurité sans modification du code en ajustant simplement le work factor
- Pas de limite de longueur imposée sur les mots de passe contrairement à certains algorithmes
- Implémentations matures et auditées disponibles dans la majorité des langages de programmation
- Compatibilité avec les standards de sécurité modernes (OWASP, NIST) pour la gestion des mots de passe
Exemple concret d'implémentation
import bcrypt from 'bcrypt';
// Configuration du facteur de coût (10-12 recommandé)
const SALT_ROUNDS = 12;
// Hachage d'un mot de passe lors de l'inscription
async function hashPassword(plainPassword: string): Promise<string> {
try {
const hashedPassword = await bcrypt.hash(plainPassword, SALT_ROUNDS);
// Résultat : $2b$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
return hashedPassword;
} catch (error) {
throw new Error('Erreur lors du hachage du mot de passe');
}
}
// Vérification lors de la connexion
async function verifyPassword(
plainPassword: string,
hashedPassword: string
): Promise<boolean> {
try {
const isMatch = await bcrypt.compare(plainPassword, hashedPassword);
return isMatch;
} catch (error) {
throw new Error('Erreur lors de la vérification du mot de passe');
}
}
// Exemple d'utilisation
async function authenticateUser(email: string, password: string) {
// Récupération du hash depuis la base de données
const user = await getUserByEmail(email);
if (!user) {
return { success: false, message: 'Utilisateur non trouvé' };
}
const isValidPassword = await verifyPassword(password, user.passwordHash);
if (isValidPassword) {
return { success: true, userId: user.id };
} else {
return { success: false, message: 'Mot de passe incorrect' };
}
}Mise en œuvre et bonnes pratiques
- Choisir un facteur de coût approprié (12-14 pour 2024) en testant les performances sur votre infrastructure cible
- Installer la bibliothèque bcrypt native (éviter les implémentations pure JavaScript moins performantes)
- Ne jamais stocker les mots de passe en clair, même temporairement en mémoire ou dans les logs
- Implémenter la vérification de manière asynchrone pour éviter de bloquer le thread principal
- Prévoir un mécanisme de rehashing automatique lorsque le facteur de coût est augmenté
- Combiner bcrypt avec d'autres mesures de sécurité (rate limiting, authentification multi-facteurs)
- Monitorer les temps de réponse pour détecter d'éventuelles attaques par déni de service ciblant le hachage
Conseil professionnel
Testez le temps d'exécution de bcrypt sur votre infrastructure avant de choisir le work factor. Visez un temps de hachage entre 250ms et 500ms : suffisamment lent pour ralentir les attaquants mais assez rapide pour ne pas dégrader l'expérience utilisateur. Utilisez l'outil de benchmark intégré : `bcrypt.getRounds(hash)` pour vérifier le facteur de coût d'un hash existant, et augmentez-le progressivement lors des changements de mot de passe utilisateurs.
Outils et écosystème
- bcrypt (Node.js) - Implémentation native la plus populaire avec bindings C++
- bcrypt-ruby - Version pour applications Ruby on Rails avec support ActiveModel
- Spring Security BCrypt - Intégration native dans l'écosystème Spring Java
- passlib (Python) - Bibliothèque complète incluant bcrypt et d'autres algorithmes
- password_hash (PHP) - Fonction native PHP utilisant bcrypt par défaut depuis PHP 5.5
- OWASP Password Storage Cheat Sheet - Guide de référence pour les meilleures pratiques
L'adoption de bcrypt représente un investissement stratégique dans la sécurité de vos applications. En protégeant efficacement les credentials de vos utilisateurs, vous réduisez significativement les risques de violation de données, préservez la confiance de votre clientèle et assurez la conformité avec les réglementations de protection des données (RGPD, CCPA). Sa capacité d'adaptation aux évolutions matérielles garantit une protection durable sans refonte architecturale majeure.
