Pourquoi générer un hash bcrypt en ligne ?
L'authentification HTTP Basic reste la façon la plus rapide de fermer un espace d'administration, une préproduction ou un tableau de bord interne. Elle repose sur un fichier .htpasswd où chaque ligne associe un identifiant à un mot de passe haché - jamais en clair.
Depuis Apache 2.4, la commande htpasswd -B produit du bcrypt, et c'est le format que recommande la documentation officielle. Le hic : cette commande suppose d'avoir installé apache2-utils sur Debian ou httpd-tools sur RHEL. Sur un poste Windows, sur un hébergement mutualisé ou depuis une interface web, elle manque souvent.
Trois situations où ce générateur dépanne :
- Protéger une préproduction → Fermer l'accès à un environnement de recette avant qu'il ne soit indexé par Google
- Ajouter un compte sans accès SSH → Créer la ligne depuis le navigateur et la coller via le gestionnaire de fichiers de votre hébergeur
- Moderniser un fichier existant → Remplacer progressivement des entrées
$apr1$par des entrées$2y$
Comment utiliser le générateur en 3 étapes
Étape 1 : Saisir l'identifiant et le mot de passe
Renseignez le nom du compte, puis son mot de passe. Le champ est masqué par défaut ; cliquez sur l'oeil pour relire votre saisie avant de valider. Le bouton "Générer un mot de passe" tire une chaîne aléatoire de 16 caractères si vous n'en avez pas déjà un.
Étape 2 : Régler le facteur de coût
Le curseur part de 10, la valeur d'htpasswd -B. Montez à 12 pour un accès sensible. Chaque cran double le temps de calcul : à la génération comme à chaque vérification par le serveur.
Étape 3 : Copier la ligne
Deux résultats sont affichés : le hash seul et la ligne .htpasswd complète. Copiez celle-ci, collez-la dans votre fichier, puis rechargez la configuration du serveur.
Anatomie d'un hash bcrypt
Une ligne .htpasswd se découpe en deux champs séparés par un deux-points :
admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
Le second champ se décompose ainsi :
| Partie | Exemple | Rôle |
|---|---|---|
| Identifiant d'algorithme | 2y | Indique au serveur qu'il s'agit de bcrypt |
| Facteur de coût | 10 | Exposant : le calcul enchaîne 2^10 = 1 024 tours |
| Sel + digest | N9qo8uLOickgx2ZMRZoMye... | 53 caractères : 22 pour le sel de 128 bits, 31 pour l'empreinte |
Contrairement à l'APR1-MD5, le sel n'occupe pas un champ séparé : il est collé au digest dans le dernier bloc. Il reste lisible en clair, ce qui est normal - son rôle n'est pas d'être secret, mais d'empêcher qu'une table pré-calculée serve à retrouver le mot de passe.
Comprendre le facteur de coût
Le coût est un exposant, pas un multiplicateur. Un coût de N enchaîne 2^N tours de dérivation de clé :
| Coût | Tours | Temps indicatif | Usage |
|---|---|---|---|
| 8 | 256 | ~15 ms | Trop faible aujourd'hui |
| 10 | 1 024 | ~60 ms | Défaut d'htpasswd -B, correct |
| 12 | 4 096 | ~250 ms | Recommandé pour un accès sensible |
| 14 | 16 384 | ~1 s | Latence perceptible à chaque connexion |
Deux choses à garder en tête. D'abord, ce temps est payé à chaque vérification, donc à chaque requête HTTP Basic : un coût de 14 sur une page chargée par un navigateur qui rejoue l'authentification à chaque ressource se sent tout de suite. Ensuite, le bon réglage dépend de votre matériel : mesurez plutôt que de recopier une valeur, la cible habituelle étant 100 à 250 ms sur le serveur qui fera la vérification.
Protéger un répertoire avec Apache
1. Créer le fichier
Placez votre fichier .htpasswd hors de la racine web, pour qu'il ne soit jamais servi par HTTP :
/var/www/secrets/.htpasswd
2. Déclarer la protection
Dans le .htaccess du répertoire à protéger, ou dans le bloc <Directory> de votre VirtualHost :
AuthType Basic
AuthName "Zone reservee"
AuthUserFile /var/www/secrets/.htpasswd
Require valid-user
3. Recharger la configuration
sudo apachectl configtest && sudo systemctl reload apache2
Pour nginx, la même paire de fichiers se déclare ainsi :
location /admin/ {
auth_basic "Zone reservee";
auth_basic_user_file /var/www/secrets/.htpasswd;
}
nginx lit bcrypt depuis la version 1.0.3 sur les systèmes dont la crypt_r() le supporte, ce qui couvre toutes les distributions Linux courantes.
bcrypt face aux autres formats .htpasswd
| Format | Préfixe | Coût de calcul | Verdict |
|---|---|---|---|
| bcrypt | $2y$ | Réglable, 2^coût tours | Recommandé pour tout nouveau projet |
| APR1-MD5 | $apr1$ | 1 000 itérations MD5 | Acceptable, compatibilité maximale |
| SHA-1 | {SHA} | 1 itération, sans sel | À éviter : pas de sel, cassable par table |
| crypt() DES | aucun | 25 itérations, tronqué à 8 caractères | Obsolète, à ne plus utiliser |
En résumé : bcrypt est le seul format .htpasswd dont le coût s'ajuste au matériel de l'époque. Les trois autres ont un coût figé, décidé dans les années 1990 ou 2000, que le progrès des GPU a rendu dérisoire. Ne gardez l'APR1-MD5 que si votre serveur ne sait pas lire $2y$.
Vérifier le hash en ligne de commande
Le résultat de cet outil est un hash bcrypt standard, vérifiable par les utilitaires système :
# Générer l'équivalent avec htpasswd (paquet apache2-utils / httpd-tools)
htpasswd -nbB admin monMotDePasse
# Imposer un facteur de coût de 12
htpasswd -nbB -C 12 admin monMotDePasse
Les deux chaînes ne seront pas identiques - le sel diffère à chaque tirage - mais toutes deux valident le même mot de passe. Pour le contrôler :
# Rejouer la vérification avec le sel du hash existant
python3 -c "import bcrypt,sys; print(bcrypt.checkpw(b'monMotDePasse', sys.argv[1].encode()))" '$2y$10$...'
FAQ - Questions fréquentes
Q : Qu'est-ce que le format $2y$ ?
R : C'est le marqueur de bcrypt dans un fichier .htpasswd. Le hash complet suit le motif $2y$<coût>$<sel><digest> : un identifiant d'algorithme, un facteur de coût sur deux chiffres, puis 53 caractères contenant le sel de 128 bits et l'empreinte. C'est ce qu'écrit htpasswd -B.
Q : Quelle différence entre $2a$, $2b$ et $2y$ ?
R : Aucune sur le fond, ce sont trois marqueurs du même algorithme. $2y$ a été introduit par PHP en 2011 pour signaler une implémentation corrigée d'un bug sur les caractères non-ASCII, bug absent de la bibliothèque utilisée ici. Apache et nginx acceptent les trois.
Q : Quel facteur de coût choisir ?
R : 10 par défaut, 12 pour un accès sensible. Le bon réflexe est de mesurer sur le serveur qui fera la vérification et de viser 100 à 250 ms : c'est assez lent pour gêner une attaque par dictionnaire, assez rapide pour ne pas se voir à l'usage.
Q : Pourquoi ne puis-je pas dépasser 15 ?
R : Le coût étant un exposant, 16 demande déjà plusieurs secondes de calcul et dépasserait le temps imparti à une requête HTTP. Pour un coût supérieur, générez le hash en local avec htpasswd -B -C 18.
Q : bcrypt est-il meilleur qu'APR1-MD5 ?
R : Oui, nettement. APR1-MD5 enchaîne 1 000 itérations de MD5, que du matériel spécialisé calcule par milliards par seconde. bcrypt exige de la mémoire et des accès non séquentiels, ce qui limite fortement le parallélisme d'un GPU. Pour un nouveau fichier .htpasswd, bcrypt sans hésiter.
Q : Puis-je utiliser un mot de passe de plus de 72 caractères ?
R : Non, et ce n'est pas une limite de cet outil : bcrypt ignore purement et simplement tout ce qui dépasse 72 octets. Un mot de passe de 80 caractères serait donc équivalent à ses 72 premiers. Attention, un caractère accentué compte pour deux octets en UTF-8.
Q : Le mot de passe est-il stocké quelque part ?
R : Non. Il transite en HTTPS jusqu'à l'API CaptainDNS le temps du calcul, puis il est oublié. Ni base de données, ni journal contenant le mot de passe en clair.
Q : Où placer le fichier .htpasswd ?
R : Hors de la racine web, par exemple dans /var/www/secrets/. S'il est placé dans un répertoire servi par HTTP, un visiteur pourrait le télécharger et attaquer les hash hors ligne - ce qui est précisément ce que le facteur de coût rend coûteux, mais pas impossible.
Outils complémentaires
| Outil | Utilité |
|---|---|
| Générateur APR1-MD5 | Produire une ligne .htpasswd au format Apache historique |
| Générateur de mots de passe | Tirer un mot de passe solide avant de le hasher |
| Hash Generator | Calculer MD5, SHA-1, SHA-256 et SHA-512 d'un texte |
| Encodeur Base64 | Encoder l'en-tête Authorization d'une requête Basic |
| Analyseur d'en-têtes HTTP | Vérifier les en-têtes renvoyés par un espace protégé |
Ressources utiles
- Documentation Apache - htpasswd (options de la commande, dont -B et -C)
- Documentation Apache - Authentification (mise en place de l'authentification Basic)
- A Future-Adaptable Password Scheme (article fondateur de bcrypt, Provos et Mazieres, 1999)
- RFC 7617 - The Basic HTTP Authentication Scheme (spécification du schéma Basic)
Engagement confidentialité
Votre mot de passe est transmis à l'API CaptainDNS uniquement pour calculer le hash, sur une connexion chiffrée. Il n'est ni stocké ni journalisé. Seules des métriques techniques anonymes sont conservées (durée de traitement, code de réponse).