Pourquoi générer un hash APR1-MD5 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 nom d'utilisateur à un mot de passe haché - jamais en clair.
Le hic : produire ce hash suppose normalement d'avoir la commande htpasswd installée, donc le paquet apache2-utils sur Debian ou httpd-tools sur RHEL. Sur un poste Windows, sur un hébergement mutualisé ou depuis une interface web, cette commande 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
- Migrer une configuration → Reconstruire un fichier
.htpasswdperdu à partir des noms d'utilisateur connus
Comment utiliser le générateur en 3 étapes
Étape 1 : Saisir le nom d'utilisateur 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'œil pour relire votre saisie avant de valider.
Étape 2 : Laisser le sel se générer
Dans la quasi-totalité des cas, laissez le champ sel vide : un sel aléatoire de 8 caractères sera tiré côté serveur. Ne renseignez ce champ que pour reproduire un hash existant à l'identique.
É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'une ligne .htpasswd
Une ligne se découpe en deux champs séparés par un deux-points :
admin:$apr1$Xq7nD2mR$5CqLZ.k1qLkOvVQ0uZ9Yl.
Le second champ se décompose lui-même en trois parties délimitées par des $ :
| Partie | Exemple | Rôle |
|---|---|---|
| Identifiant d'algorithme | apr1 | Indique au serveur qu'il s'agit du MD5 salé d'Apache |
| Sel | Xq7nD2mR | 8 caractères tirés au hasard, stockés en clair dans le fichier |
| Digest | 5CqLZ.k1qLkOvVQ0uZ9Yl. | 22 caractères, résultat des 1 000 itérations |
Le sel n'est pas un secret : il est lisible dans le fichier. Son rôle est d'empêcher qu'une table pré-calculée (rainbow table) ne serve à retrouver le mot de passe, et de garantir que deux comptes partageant le même mot de passe n'aient pas le même digest.
Ce que fait réellement l'algorithme $apr1$
APR1-MD5 n'est pas un simple md5(mot de passe + sel). Il enchaîne :
- Deux empreintes initiales - l'une sur
mot de passe + $apr1$ + sel, l'autre surmot de passe + sel + mot de passe - Un mélange dépendant de la longueur - des fragments de la seconde empreinte sont réinjectés dans la première, octet par octet
- 1 000 itérations - à chaque tour, mot de passe, sel et empreinte précédente sont recombinés selon un motif qui dépend du numéro du tour
- Un encodage base64 « crypt » - les 16 octets finaux sont relus dans un ordre entrelacé, puis codés sur l'alphabet
./0-9A-Za-z
Ce sont ces 1 000 itérations qui font la différence avec un MD5 nu : elles multiplient par mille le coût d'une tentative, ce qui ralentit d'autant une attaque par dictionnaire.
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;
}
APR1-MD5 face aux autres formats .htpasswd
| Format | Préfixe | Coût de calcul | Verdict |
|---|---|---|---|
| bcrypt | $2y$ | Réglable (facteur de coût) | 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é : si votre serveur accepte bcrypt (htpasswd -B), utilisez-le. APR1-MD5 est le meilleur choix restant quand bcrypt n'est pas disponible - et il vaut infiniment mieux qu'un {SHA} sans sel.
Vérifier le hash en ligne de commande
Le résultat de cet outil est identique, à sel égal, à celui des utilitaires système :
# Avec htpasswd (paquet apache2-utils / httpd-tools)
htpasswd -nbm admin monMotDePasse
# Avec OpenSSL, en imposant le sel
openssl passwd -apr1 -salt Xq7nD2mR monMotDePasse
Le second exemple permet de contrôler cet outil : renseignez le même sel dans le formulaire, vous devez obtenir exactement la même chaîne.
Pour vérifier qu'un mot de passe correspond à une ligne existante, relisez le sel dans le hash stocké et rejouez le calcul avec ce sel.
FAQ - Questions fréquentes
Q : Qu'est-ce que le format $apr1$ ?
R : C'est le format de hachage historique d'Apache, également appelé APR1-MD5. Il applique 1 000 itérations de MD5 sur le mot de passe et un sel de 8 caractères, puis encode le résultat dans l'alphabet base64 de crypt. Le préfixe $apr1$ sert d'identifiant d'algorithme.
Q : APR1-MD5 est-il encore sûr ?
R : Il est bien plus solide qu'un MD5 nu, mais il reste rapide à calculer pour un attaquant équipé de GPU. Pour un nouveau projet, préférez bcrypt via htpasswd -B. APR1-MD5 garde son intérêt quand la compatibilité prime : anciennes versions d'Apache, nginx sans support bcrypt, appliances réseau.
Q : Ce hash fonctionne-t-il avec nginx ?
R : Oui. Le module ngx_http_auth_basic_module de nginx lit le format Apache, $apr1$ compris. La ligne générée s'utilise telle quelle avec auth_basic_user_file.
Q : Pourquoi obtenir un hash différent à chaque fois ?
R : Un nouveau sel aléatoire est tiré à chaque génération. Les deux hash sont valides pour le même mot de passe : à la vérification, le serveur relit le sel stocké dans le hash et refait le calcul. Renseignez le champ sel si vous voulez un résultat reproductible.
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 : Puis-je utiliser des accents ou des symboles ?
R : Oui, le calcul porte sur les octets UTF-8 du mot de passe. Attention toutefois : un client HTTP ancien peut encoder les caractères non-ASCII différemment, ce qui ferait échouer l'authentification. En cas de doute, restez en ASCII.
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.
Outils complémentaires
| Outil | Utilité |
|---|---|
| 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é |
| Test HSTS | S'assurer que l'accès protégé passe bien en HTTPS |
Ressources utiles
- Documentation Apache - htpasswd (options de la commande et formats supportés)
- Documentation Apache - Authentification (mise en place de l'authentification Basic)
- RFC 7617 - The Basic HTTP Authentication Scheme (spécification du schéma Basic)
- RFC 1321 - MD5 (spécification de la fonction MD5)
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).