Skip to content

Générateur htpasswd — bcrypt, Apache MD5 (apr1), Basic Auth

Générez des entrées htpasswd avec bcrypt, Apache MD5 (apr1), SHA-1 et plus. Obtenez des configs Apache, nginx et Docker prêtes à coller. 100 % dans votre navigateur — aucun envoi.

Sans pistage Fonctionne dans le navigateur Gratuit
100 % dans votre navigateur — les mots de passe ne quittent jamais votre appareil.
Serveur
Coût bcrypt: 12
Entrée htpasswd
En-tête Authorization
 
Vérifier un hash existant
Révisé pour la correction des hashes et la conformité aux standards Basic Auth — Go Tools Engineering Team · 4 juin 2026

Qu'est-ce qu'un fichier htpasswd ?

Un fichier .htpasswd stocke les credentials utilisés par l'authentification HTTP Basic. Chaque ligne est une paire nom_utilisateur:hash, où le hash est un condensé unidirectionnel du mot de passe — le texte en clair n'est jamais stocké. Les serveurs web lisent ce fichier pour décider qui peut accéder à une URL protégée. Sur Apache, un fichier .htaccess (ou un bloc <Directory>) référence le fichier .htpasswd et invite le navigateur à saisir un nom d'utilisateur et un mot de passe avant de servir la page.

Le format du hash dépend de l'algorithme utilisé pour le produire. L'outil htpasswd d'Apache peut en émettre plusieurs : bcrypt (lignes commençant par $2y$) est le plus solide et est recommandé pour Apache, Docker Registry et Caddy ; apr1 (Apache MD5, commençant par $apr1$) est le plus portable et le choix sûr par défaut pour nginx ; SHA-1 (commençant par {SHA}) est sans sel et considéré comme non sécurisé ; crypt (DES traditionnel) est un format hérité qui tronque à 8 caractères ; et plain stocke le mot de passe en clair, ce qui ne doit jamais être utilisé en production.

Ce générateur s'exécute entièrement dans votre navigateur — aucun nom d'utilisateur, mot de passe ou hash n'est jamais envoyé. Si vous avez besoin d'un mot de passe robuste pour accompagner votre entrée, utilisez notre Générateur de mot de passe aléatoire. Pour construire manuellement l'en-tête Authorization: Basic, le credential est simplement base64(utilisateur:mot_de_passe), que vous pouvez produire avec notre Encodeur Base64. Et une fois votre endpoint protégé, testez-le depuis la ligne de commande avec notre Constructeur de commande cURL.

# Apache htpasswd CLI equivalents (apache2-utils / httpd-tools)

# bcrypt entry, printed to stdout (recommended; -B = bcrypt, -n = no file, -b = password on CLI)
htpasswd -Bbn admin 's3cret'
# → admin:$2y$10$N9qo8uLOickgx2ZMRZoMye...

# apr1 (Apache MD5) entry, portable for nginx — no apache2-utils needed
printf "admin:$(openssl passwd -apr1 's3cret')\n"
# → admin:$apr1$k3l4Hj9.$qN8...

# Append a user to an existing file from the shell
htpasswd -B /etc/apache2/.htpasswd alice

# Note: nginx delegates bcrypt to the system crypt(); on Alpine/musl or old
# glibc that fails — prefer apr1 for nginx to stay portable.

Fonctionnalités clés

Plusieurs algorithmes de hachage

Générez des entrées bcrypt ($2y$), apr1 / Apache MD5 ($apr1$) et SHA-1 ({SHA}) — ainsi qu'une option plain (texte clair) pour les tests. Chacun utilise un sel cryptographique aléatoire lorsque le format le prend en charge.

Générer et vérifier

Créez de nouvelles entrées ou vérifiez des entrées existantes. Collez une ligne utilisateur:hash stockée et un mot de passe candidat pour confirmer instantanément s'ils correspondent — utile pour déboguer une erreur 401 en production.

Choix par serveur

Choisissez Apache, nginx, Docker ou Caddy et l'algorithme correct est sélectionné automatiquement — bcrypt là où il est pris en charge, apr1 pour la portabilité nginx — pour éviter les échecs silencieux de crypt().

Blocs de configuration prêts à coller

Obtenez six extraits de configuration copiables — Apache .htaccess, nginx auth_basic, Docker, Kubernetes ingress-nginx, Caddy et Traefik — déjà liés à votre entrée .htpasswd générée.

100 % côté client

Tout le hachage s'effectue localement dans votre navigateur via Web Crypto et une implémentation bcrypt intégrée. Aucun nom d'utilisateur, mot de passe ou hash n'est jamais envoyé à un serveur, ce qui vous permet de générer des credentials de production en toute confidentialité.

Exemples

Entrée bcrypt (recommandée)

admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

Une entrée bcrypt avec un préfixe $2y$ et un coût 10. Il s'agit du format le plus solide et le plus portable — utilisez-le pour Apache, Docker Registry, Caddy et Traefik.

Entrée apr1 (nginx portable)

admin:$apr1$kl3H9j2.$qN8vY7tLp2mZ0xW5cR4fK1

Apache MD5 (apr1) avec un sel de 8 caractères après le marqueur $apr1$. Le choix sûr par défaut pour nginx, où la vérification bcrypt dépend d'une fonction crypt() système peu fiable.

Entrée SHA-1 (héritage)

admin:{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=

Une entrée {SHA} est le base64 d'un condensé SHA-1 sans sel. Apache et nginx l'acceptent, mais elle est sans sel et non sécurisée — incluse uniquement pour la compatibilité avec les systèmes hérités.

En-tête Authorization: Basic

Authorization: Basic YWRtaW46czNjcmV0

Le credential côté client pour le même utilisateur : base64('admin:s3cret'). Envoyez cet en-tête avec curl -H ou Postman pour vous authentifier sans écrire de fichier .htpasswd.

Fichier .htpasswd multi-utilisateurs

admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
alice:$2y$10$3bQ8xY7tLp2mZ0xW5cR4fO9vK1jH6sD2nG8aQ5wE3rT7uI4oP1cm
bob:$apr1$mZ0xW5cR$4fK1jH6sD2nG8aQ5wE3rT2

Une ligne nom_utilisateur:hash par utilisateur. Les algorithmes peuvent être mélangés dans le même fichier — ici deux entrées bcrypt et une entrée apr1 coexistent pour trois utilisateurs.

Comment utiliser

  1. 1

    Configurer le serveur et l'algorithme

    Choisissez votre serveur cible (Apache, nginx, Docker, Caddy). L'algorithme approprié est sélectionné automatiquement — bcrypt pour Apache/Docker/Caddy, apr1 pour nginx portable — mais vous pouvez le remplacer et ajuster le coût bcrypt.

  2. 2

    Générer le hash

    Saisissez un nom d'utilisateur et un mot de passe (ou cliquez sur Mot de passe aléatoire), puis cliquez sur Générer. Le hash est calculé localement avec un sel aléatoire. Re-générez le sel à tout moment pour créer une nouvelle entrée.

  3. 3

    Copier l'entrée

    Copiez la ligne utilisateur:hash pour votre fichier .htpasswd, copiez la commande echo >> pour le terminal, ou copiez l'en-tête Authorization: Basic pour curl et Postman.

  4. 4

    Déployer la configuration

    Collez le bloc de configuration généré dans votre .htaccess Apache, le bloc serveur nginx, Docker, l'ingress Kubernetes, Caddy ou la configuration Traefik, pointez-le vers votre fichier .htpasswd et rechargez le serveur.

Cas d'utilisation courants

Protection de répertoire Apache
Verrouillez un dossier avec HTTP Basic Auth à l'aide d'un fichier .htaccess et d'une directive AuthUserFile. Insérez l'entrée bcrypt et le bloc de configuration Apache généré pour exiger une connexion sur n'importe quel chemin.
nginx auth_basic
Protégez un bloc location ou serveur avec auth_basic et auth_basic_user_file. Utilisez le format apr1 pour que la vérification fonctionne de manière fiable sur Alpine, Debian et d'autres images de base.
Docker Registry
Un Docker Registry privé n'accepte que les entrées htpasswd au format bcrypt. Générez une ligne $2y$ avec htpasswd -Bbn, montez-la dans le conteneur du registre et authentifiez votre docker login.
Kubernetes ingress-nginx
Créez un Secret basic-auth à partir de votre fichier .htpasswd et référencez-le avec les annotations nginx.ingress.kubernetes.io/auth-type et auth-secret pour contrôler l'accès à une route ingress.
Caddy et Traefik
La directive basic_auth de Caddy et le middleware basicauth de Traefik attendent tous deux des hashes bcrypt. Collez l'entrée générée directement dans votre Caddyfile ou vos labels/configuration dynamique Traefik.
En-tête Authorization curl et Postman
Évitez entièrement le fichier pour des tests rapides : copiez l'en-tête Authorization: Basic pour envoyer des credentials directement. Insérez-le dans un flag curl -H ou une requête Postman pour accéder à un endpoint protégé.

Détails techniques

bcrypt ($2y$)
Un hash adaptatif et salé basé sur le chiffrement Blowfish avec un facteur de coût réglable. Chaque entrée intègre un sel aléatoire de 16 octets et le coût, de sorte que des mots de passe identiques produisent des hashes différents. Remarque : bcrypt tronque le mot de passe à 72 octets — les caractères au-delà sont ignorés.
apr1 (Apache MD5)
La variante MD5 itérée et salée d'Apache ($apr1$ + sel de 8 caractères). Elle effectue 1 000 tours MD5, ce qui est bien moins solide que le coût adaptatif de bcrypt, mais elle est implémentée nativement par Apache et nginx, ce qui en fait le format le plus portable sur toutes les plateformes et images de base.
SHA-1 et crypt
Les entrées SHA-1 ({SHA} + condensé base64) sont sans sel, donc des mots de passe identiques produisent des hashes identiques et sont vulnérables aux tables arc-en-ciel — incluses uniquement pour la compatibilité avec les systèmes hérités. Le crypt traditionnel (DES) est encore plus faible et tronque silencieusement les mots de passe à 8 caractères.
Sel et itérations
Le salage empêche les attaques précalculées (tables arc-en-ciel) en rendant chaque hash unique. bcrypt utilise un sel aléatoire de 128 bits avec un coût configurable ; apr1 utilise un sel de 8 caractères avec 1 000 itérations fixes. Utilisez Re-générer le sel pour recalculer un hash valide différent pour le même mot de passe.
Gestion de Base64 et UTF-8
Les mots de passe sont encodés en octets UTF-8 avant le hachage, ce qui garantit une gestion cohérente des caractères non ASCII. L'en-tête Authorization: Basic est le base64 des octets UTF-8 bruts de nom_utilisateur:mot_de_passe, correspondant à ce que les serveurs décodent à la réception.
Notes d'honnêteté et mises en garde
Les hashes générés sont calculés localement et jamais vérifiés contre un serveur actif. Les entrées copiées et les fichiers .htpasswd téléchargés arrivent dans votre presse-papiers et sur votre disque sous forme de hash en texte clair — traitez-les comme des secrets, restreignez les permissions des fichiers et videz votre presse-papiers après collage dans une configuration de production.

Bonnes pratiques

Préférez bcrypt partout où il est pris en charge
Utilisez bcrypt ($2y$) pour Apache, Docker, Caddy et Traefik — il est salé, adaptatif et bien plus solide qu'apr1 ou SHA-1. Réservez apr1 uniquement pour nginx quand la dépendance de bcrypt à la fonction crypt() système le rend peu fiable.
Stockez le fichier en dehors de la racine web
Gardez .htpasswd hors de tout répertoire servi afin qu'il ne puisse jamais être téléchargé via HTTP. Définissez chmod 640 et faites-le appartenir à l'utilisateur du serveur web pour que le serveur puisse le lire tandis que les autres comptes ne le peuvent pas.
Servez toujours via HTTPS
Basic Auth transmet les credentials sous forme de base64 réversible à chaque requête. Sans TLS, n'importe qui sur le chemin réseau peut lire le mot de passe. N'activez jamais Basic Auth sur HTTP simple — terminez TLS devant l'endpoint protégé.
Utilisez des mots de passe uniques et robustes
Chaque compte doit avoir son propre mot de passe à haute entropie, jamais réutilisé sur plusieurs services. Générez-en un avec notre Générateur de mot de passe aléatoire et stockez-le dans un gestionnaire de mots de passe plutôt que de l'inventer à la main.

Foire aux questions

bcrypt ou apr1 — lequel choisir ?
Utilisez bcrypt pour Apache, Docker Registry, Caddy et Traefik — c'est un hash adaptatif et salé, qui constitue le standard moderne. Utilisez apr1 (Apache MD5) pour nginx, car nginx délègue bcrypt à la fonction crypt() du système et cela échoue sur de nombreuses configurations, tandis qu'apr1 est implémenté en interne et fonctionne partout. Si vous contrôlez l'environnement d'exécution et savez que bcrypt est pris en charge, bcrypt est toujours le choix le plus solide ; apr1 est une question de portabilité, non de sécurité.
nginx prend-il en charge bcrypt ?
Seulement indirectement, et de manière peu fiable. nginx ne hache pas les mots de passe lui-même — pour les entrées $2y$, il délègue la vérification à la fonction crypt() de la bibliothèque C, donc la prise en charge dépend entièrement de votre libc. La musl d'Alpine et les anciennes versions de glibc n'incluent pas le schéma blowfish (bcrypt), donc l'authentification échoue silencieusement. Pour les configurations nginx portables, utilisez plutôt le format apr1, que nginx vérifie en interne sur toutes les plateformes.
Comment corriger l'erreur nginx `crypt_r() failed (22: Invalid argument)` ?
Cette erreur signifie que nginx a tenté de vérifier un hash bcrypt ($2y$) sur une libc qui ne prend pas en charge le schéma blowfish — typiquement Alpine/musl ou un ancien glibc. La solution est de régénérer l'entrée en apr1 (Apache MD5) plutôt qu'en bcrypt, que nginx vérifie en interne sur n'importe quelle plateforme. Vous pouvez également passer à une image de base dont la libc inclut la prise en charge de bcrypt, mais apr1 est la solution la plus simple et portable.
Où placer le fichier .htpasswd et quelles permissions lui donner ?
Stockez le fichier .htpasswd en dehors de la racine du document web afin qu'il ne puisse jamais être servi comme fichier statique et exposé. Un emplacement courant est /etc/apache2/.htpasswd ou /etc/nginx/.htpasswd. Définissez les permissions à 640 (chmod 640) et faites-le appartenir à l'utilisateur sous lequel tourne le serveur web (par exemple www-data ou nginx), afin que le serveur puisse le lire mais que les autres comptes ne le puissent pas.
Comment configurer Basic Auth dans .htaccess ou nginx ?
Pour Apache, cet outil génère un bloc .htaccess avec AuthType Basic, AuthName, AuthUserFile pointant vers votre chemin .htpasswd et Require valid-user. Pour nginx, il génère un bloc location avec auth_basic "Restricted"; et auth_basic_user_file /chemin/.htpasswd;. Copiez le bloc de configuration correspondant à votre serveur, ajustez le chemin du fichier et rechargez — les extraits sont prêts à coller.
Mes mots de passe sont-ils envoyés quelque part ?
Non. Chaque hash est calculé entièrement dans votre navigateur en JavaScript — aucun nom d'utilisateur, mot de passe ou hash généré n'est jamais envoyé sur le réseau. Vous pouvez le vérifier en ouvrant les Outils de développement de votre navigateur (F12 → onglet Réseau) pendant la génération : il n'y a aucune requête sortante. Rien n'est stocké ni journalisé sur aucun serveur, il est donc sûr de générer ici des credentials de production réels.
Quelle est la différence entre $2a$, $2b$ et $2y$ en bcrypt ?
Ce sont des préfixes de version pour le même algorithme bcrypt et produisent des hashes équivalents ; les différences remontent à des correctifs historiques dans la façon dont certaines implémentations géraient les caractères à bits élevés et la longueur des chaînes. Le htpasswd d'Apache émet $2y$. Les bibliothèques bcrypt modernes traitent $2a$, $2b$ et $2y$ comme interchangeables pour la vérification, donc une entrée $2y$ générée ici sera validée correctement dans Apache, Caddy, Traefik et Docker Registry.
Quel coût bcrypt utiliser ?
Le coût 12 est la valeur par défaut moderne et un bon équilibre entre sécurité et vitesse. Le coût est un facteur de travail : chaque incrément double le temps de calcul et de vérification du hash, ce qui ralentit les attaques par force brute mais ajoute aussi de la latence à chaque connexion. Le coût 10 est acceptable pour les endpoints à faible trafic ou à faible risque ; 12 à 14 est recommandé pour tout ce qui est sensible. Évitez de monter trop haut au point que l'authentification légitime devienne perceptiblement lente.
htpasswd versus l'en-tête Authorization: Basic — quelle est la différence ?
Ils se situent aux deux extrémités du même échange. Le fichier .htpasswd contient le hash stocké côté serveur — un condensé unidirectionnel que le serveur utilise pour vérifier les credentials. L'en-tête Authorization: Basic est le credential de requête côté client : le base64 littéral de nom_utilisateur:mot_de_passe que le navigateur ou curl envoie à chaque requête. Le serveur décode le base64 de l'en-tête, puis vérifie le mot de passe par rapport au hash stocké. L'un est le stockage, l'autre est le transport.
Je n'ai pas apache2-utils installé — comment générer une entrée htpasswd ?
Vous n'en avez pas besoin — cet outil génère des entrées bcrypt, apr1 et SHA-1 valides entièrement dans votre navigateur. Si vous préférez la ligne de commande, OpenSSL est disponible sur presque tous les systèmes : exécutez openssl passwd -apr1 pour produire un hash apr1, puis préfixez-le avec nom_utilisateur: pour former la ligne. Sur Debian/Ubuntu, vous pouvez aussi installer le binaire htpasswd via apt install apache2-utils, ou httpd-tools sur RHEL/CentOS.
Que signifient les options htpasswd -B, -Bbn, -bnB ?
Chaque lettre est une option indépendante : -B sélectionne bcrypt, -n affiche le résultat sur la sortie standard au lieu d'écrire dans un fichier, et -b prend le mot de passe comme argument en ligne de commande (plutôt que de le demander en invite). L'ordre n'a pas d'importance, donc -Bbn et -bnB sont identiques. -Bbn est la combinaison courante pour injecter une entrée bcrypt dans un fichier htpasswd de Docker Registry.
Pourquoi Docker Registry exige-t-il bcrypt ?
Le backend d'authentification htpasswd de Docker Registry n'accepte que les entrées au format bcrypt ; les hashes apr1, SHA-1 et crypt sont rejetés et la connexion échouera. Générez l'entrée avec htpasswd -Bbn utilisateur mot_de_passe (ou utilisez l'option bcrypt ici), montez le fichier dans le conteneur du registre et pointez REGISTRY_AUTH_HTPASSWD_PATH dessus. Associez toujours cela à TLS, car les credentials Basic Auth sont sinon lisibles en transit.
Basic Auth est-il sécurisé ?
Uniquement sur HTTPS. HTTP Basic Auth envoie les credentials sous forme de base64(nom_utilisateur:mot_de_passe) à chaque requête, et base64 est un encodage réversible — pas un chiffrement — donc quiconque peut lire le trafic peut récupérer le mot de passe instantanément. Sur TLS, l'en-tête est chiffré en transit et Basic Auth est acceptable pour un contrôle d'accès simple. Ne l'utilisez jamais sur HTTP simple, et préférez des schémas plus solides pour les applications à haute valeur.

Générateur & Constructeur de commande cURL

Web & API

Construisez des commandes curl dans votre navigateur — méthode, en-têtes, authentification et corps, obtenez instantanément une commande prête à copier. Préréglages Bearer, POST JSON, upload. Gratuit, privé, sans inscription.

Convertisseur de Base — Binaire, Hex, Décimal & Octal

Outils de conversion

Convertissez entre binaire, hexadécimal, décimal, octal et toute base (2-36) instantanément. Gratuit, privé, 100 % dans votre navigateur.

Décodeur et Encodeur Base64

Encodage et formatage

Décodez et encodez en Base64 en ligne gratuitement. Conversion en temps réel, support UTF-8 et émojis. 100 % privé, dans votre navigateur.

Convertisseur de casse — UPPERCASE, lowercase, camelCase

Traitement de texte

Convertissez instantanément du texte entre UPPERCASE, lowercase, Title Case, Sentence case, camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE et 6 autres formats. Gratuit, navigateur, sans inscription.

Convertisseur de couleurs — HEX, RGB, HSL et OKLCH

Outils de conversion

Convertissez HEX en RGB, HSL, OKLCH, OKLAB et CMYK dans votre navigateur — copiez n'importe quel format en un clic. Gratuit, sans inscription, vos couleurs ne quittent jamais la page.

Générateur crontab et constructeur d'expressions cron

Date et heure

Construisez et décodez des expressions cron dans le navigateur. Aperçu en direct de la prochaine exécution en heure locale ou UTC. POSIX 5 champs, préréglages, description claire. Gratuit et privé.