Skip to content

Generador htpasswd — bcrypt, Apache MD5 (apr1) y Basic Auth

Genera entradas htpasswd con bcrypt, Apache MD5 (apr1), SHA-1 y más. Obtén configuración lista para pegar en Apache, nginx y Docker. 100% en tu navegador — sin subidas.

Sin rastreo Se ejecuta en el navegador Gratis
100% en tu navegador — las contraseñas nunca salen de tu dispositivo.
Servidor
Coste bcrypt: 12
Entrada htpasswd
Cabecera Authorization
 
Verificar un hash existente
Revisado para verificar la corrección del hash y el cumplimiento de los estándares de Basic Auth — Go Tools Engineering Team · Jun 4, 2026

¿Qué es un archivo htpasswd?

Un archivo .htpasswd almacena las credenciales que usa la autenticación HTTP Basic. Cada línea es un par usuario:hash, donde el hash es un resumen unidireccional de la contraseña — el texto en claro nunca se guarda. Los servidores web leen este archivo para decidir quién puede acceder a una URL protegida. En Apache, un archivo .htaccess (o un bloque <Directory>) referencia el archivo .htpasswd y solicita al navegador usuario y contraseña antes de servir la página.

El formato del hash depende del algoritmo que lo generó. La herramienta htpasswd de Apache puede emitir varios: bcrypt (líneas que comienzan con $2y$) es el más sólido y se recomienda para Apache, Docker Registry y Caddy; apr1 (Apache MD5, que comienza con $apr1$) es el más portátil y el valor predeterminado seguro para nginx; SHA-1 (que comienza con {SHA}) no usa sal y se considera inseguro; crypt (DES tradicional) es heredado y trunca las contraseñas a 8 caracteres; y plain almacena la contraseña en texto claro, algo que nunca debe usarse en producción.

Este generador se ejecuta íntegramente en tu navegador — ningún nombre de usuario, contraseña ni hash se sube en ningún momento. Si necesitas una contraseña sólida para tu entrada, usa nuestro Generador de Contraseñas Aleatorias. Para construir manualmente la cabecera Authorization: Basic, la credencial es simplemente base64(usuario:contraseña), que puedes generar con nuestro Codificador Base64. Y una vez que tu endpoint esté protegido, pruébalo desde la línea de comandos con nuestro Constructor de comandos 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.

Características clave

Múltiples algoritmos de hash

Genera entradas bcrypt ($2y$), apr1 / Apache MD5 ($apr1$) y SHA-1 ({SHA}), además de una opción plain (texto claro) para pruebas. Cada una usa una sal criptográfica nueva cuando el formato lo admite.

Generar y verificar

Crea nuevas entradas o verifica las existentes. Pega una línea usuario:hash almacenada y una contraseña candidata para confirmar al instante si coinciden — útil para depurar un 401 en producción.

Elegir por servidor

Selecciona Apache, nginx, Docker o Caddy y el algoritmo correcto se elige automáticamente — bcrypt donde está soportado, apr1 para portabilidad en nginx — para evitar fallos silenciosos de crypt().

Bloques de configuración listos para pegar

Obtén seis fragmentos de configuración listos para copiar — Apache .htaccess, nginx auth_basic, Docker, Kubernetes ingress-nginx, Caddy y Traefik — ya vinculados a tu entrada .htpasswd generada.

100% del lado del cliente

Todo el hashing ocurre localmente en tu navegador mediante Web Crypto y una implementación bcrypt incluida. Ningún nombre de usuario, contraseña ni hash se envía jamás a un servidor, por lo que puedes generar credenciales de producción de forma privada.

Ejemplos

Entrada bcrypt (recomendada)

admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

Una entrada bcrypt con prefijo $2y$ y coste 10. Es el formato más robusto y portátil — úsalo para Apache, Docker Registry, Caddy y Traefik.

Entrada apr1 (nginx portátil)

admin:$apr1$kl3H9j2.$qN8vY7tLp2mZ0xW5cR4fK1

Apache MD5 (apr1) con una sal de 8 caracteres tras el marcador $apr1$. El valor predeterminado seguro para nginx, donde la verificación bcrypt depende de un crypt() del sistema poco fiable.

Entrada SHA-1 (heredada)

admin:{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=

Una entrada {SHA} es el base64 de un resumen SHA-1 sin sal. Apache y nginx la aceptan, pero no tiene sal y es insegura — se incluye solo por compatibilidad con sistemas heredados.

Cabecera Authorization: Basic

Authorization: Basic YWRtaW46czNjcmV0

La credencial del lado del cliente para el mismo usuario: base64('admin:s3cret'). Envía esta cabecera con curl -H o Postman para autenticarte sin necesitar un archivo .htpasswd.

Archivo .htpasswd con múltiples usuarios

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

Una línea usuario:hash por usuario. Los algoritmos pueden mezclarse en el mismo archivo — aquí conviven dos entradas bcrypt y una apr1 para tres usuarios.

Cómo usar

  1. 1

    Configurar servidor y algoritmo

    Elige tu servidor de destino (Apache, nginx, Docker, Caddy). El algoritmo correcto se selecciona automáticamente — bcrypt para Apache/Docker/Caddy, apr1 para nginx portátil — aunque puedes cambiarlo y ajustar el coste de bcrypt.

  2. 2

    Generar el hash

    Introduce un nombre de usuario y contraseña (o haz clic en Contraseña aleatoria) y luego haz clic en Generar. El hash se calcula localmente con una sal aleatoria nueva. Regenera la sal en cualquier momento para crear una nueva entrada.

  3. 3

    Copiar la entrada

    Copia la línea usuario:hash para tu archivo .htpasswd, copia el comando echo >> para la terminal, o copia la cabecera Authorization: Basic para curl y Postman.

  4. 4

    Desplegar la configuración

    Pega el bloque de configuración generado en tu .htaccess de Apache, bloque de servidor nginx, Docker, Kubernetes ingress, Caddy o configuración de Traefik, apúntalo a tu archivo .htpasswd y recarga el servidor.

Casos de uso habituales

Protección de directorios en Apache
Bloquea una carpeta con HTTP Basic Auth usando un archivo .htaccess y una directiva AuthUserFile. Añade la entrada bcrypt y el bloque de configuración Apache generado para requerir inicio de sesión en cualquier ruta.
auth_basic en nginx
Protege un bloque location o server con auth_basic y auth_basic_user_file. Usa el formato apr1 para que la verificación funcione de forma fiable en Alpine, Debian y otras imágenes base.
Docker Registry
Un Docker Registry privado solo acepta entradas htpasswd en formato bcrypt. Genera una línea $2y$ con htpasswd -Bbn, monta el archivo en el contenedor del registro y autentica tu docker login.
Kubernetes ingress-nginx
Crea un Secret de basic-auth a partir de tu archivo .htpasswd y referéncialo con las anotaciones nginx.ingress.kubernetes.io/auth-type y auth-secret para proteger una ruta ingress.
Caddy y Traefik
La directiva basic_auth de Caddy y el middleware basicauth de Traefik esperan hashes bcrypt. Pega la entrada generada directamente en tu Caddyfile o en las etiquetas/configuración dinámica de Traefik.
Cabecera Authorization con curl y Postman
Omite el archivo por completo en pruebas rápidas: copia la cabecera Authorization: Basic para enviar credenciales directamente. Úsala con la opción -H de curl o en una solicitud de Postman para acceder a un endpoint protegido.

Detalles técnicos

bcrypt ($2y$)
Un hash adaptativo y con sal basado en el cifrado Blowfish con un factor de coste ajustable. Cada entrada incorpora una sal aleatoria de 16 bytes y el coste, por lo que contraseñas idénticas producen hashes distintos. Nota: bcrypt trunca la contraseña a 72 bytes — los caracteres más allá de ese límite se ignoran.
apr1 (Apache MD5)
La variante MD5 iterada y con sal de Apache ($apr1$ + sal de 8 caracteres). Ejecuta 1.000 rondas de MD5, lo que es mucho más débil que el coste adaptativo de bcrypt, pero está implementada de forma nativa en Apache y nginx, lo que la convierte en el formato más portátil entre plataformas e imágenes base.
SHA-1 y crypt
Las entradas SHA-1 ({SHA} + resumen en base64) no tienen sal, por lo que contraseñas idénticas producen hashes idénticos y son vulnerables a tablas arcoíris — se incluyen solo por compatibilidad heredada. El crypt tradicional (DES) es aún más débil y trunca silenciosamente las contraseñas a 8 caracteres.
Sal e iteraciones
La sal previene los ataques precomputados (tablas arcoíris) al hacer único cada hash. bcrypt usa una sal aleatoria de 128 bits con un coste configurable; apr1 usa una sal de 8 caracteres con 1.000 iteraciones fijas. Usa Regenerar sal para obtener un hash válido diferente para la misma contraseña.
Manejo de Base64 y UTF-8
Las contraseñas se codifican como bytes UTF-8 antes del hashing, por lo que los caracteres no ASCII se manejan de forma coherente. La cabecera Authorization: Basic es el base64 de los bytes UTF-8 en crudo de usuario:contraseña, lo que coincide con lo que los servidores decodifican en el extremo receptor.
Notas de transparencia y advertencias
Los hashes generados se calculan localmente y nunca se verifican contra un servidor en vivo. Las entradas copiadas y los archivos .htpasswd descargados llegan a tu portapapeles y disco en forma de hash de texto — trátalos como secretos, restringe los permisos del archivo y borra el portapapeles tras pegarlo en una configuración de producción.

Buenas prácticas

Prefiere bcrypt siempre que esté soportado
Usa bcrypt ($2y$) para Apache, Docker, Caddy y Traefik — tiene sal, es adaptativo y mucho más robusto que apr1 o SHA-1. Reserva apr1 solo para nginx cuando la dependencia de bcrypt en el crypt() del sistema lo haga poco fiable.
Guarda el archivo fuera de la raíz web
Mantén .htpasswd fuera de cualquier directorio servido para que nunca pueda descargarse por HTTP. Establece chmod 640 y asígnalo al usuario del servidor web para que el servidor pueda leerlo mientras otras cuentas no puedan.
Usa siempre HTTPS
Basic Auth transmite las credenciales como base64 reversible en cada solicitud. Sin TLS, cualquiera en la ruta de red puede leer la contraseña. Nunca actives Basic Auth en HTTP plano — termina TLS delante del endpoint protegido.
Usa contraseñas únicas y sólidas
Cada cuenta debe tener su propia contraseña de alta entropía, nunca reutilizada en otros servicios. Genera una con nuestro Generador de Contraseñas Aleatorias y guárdala en un gestor de contraseñas en lugar de inventarla manualmente.

Preguntas frecuentes

bcrypt vs apr1 — ¿cuál debo elegir?
Usa bcrypt para Apache, Docker Registry, Caddy y Traefik — es un hash sólido, con sal y adaptativo, y es el estándar moderno. Usa apr1 (Apache MD5) para nginx, porque nginx delega bcrypt en el crypt() del sistema y eso falla en muchas compilaciones, mientras que apr1 se implementa internamente y funciona en todas partes. Si controlas el entorno de ejecución y sabes que bcrypt está soportado, bcrypt es siempre la opción más sólida; apr1 es una cuestión de portabilidad, no de seguridad.
¿Admite nginx bcrypt?
Solo de forma indirecta y poco fiable. nginx no genera hashes de contraseñas por sí mismo — para las entradas $2y$ delega la verificación en la función crypt() de la biblioteca C, por lo que el soporte depende completamente de tu libc. El musl de Alpine y las compilaciones antiguas de glibc no incluyen el esquema blowfish (bcrypt), así que la autenticación falla silenciosamente. Para configuraciones nginx portátiles, usa el formato apr1, que nginx verifica internamente en todas las plataformas.
¿Cómo soluciono el error de nginx `crypt_r() failed (22: Invalid argument)`?
Ese error significa que nginx intentó verificar un hash bcrypt ($2y$) en una libc que no admite el esquema blowfish — típicamente Alpine/musl o un glibc antiguo. La solución es regenerar la entrada como apr1 (Apache MD5) en lugar de bcrypt, ya que nginx lo verifica internamente en cualquier plataforma. Alternativamente, puedes cambiar a una imagen base cuya libc incluya soporte para bcrypt, pero apr1 es la solución más sencilla y portátil.
¿Dónde debo guardar el archivo .htpasswd y con qué permisos?
Guarda el archivo .htpasswd fuera de la raíz de documentos web para que nunca pueda servirse como archivo estático y quede expuesto. Una ubicación habitual es /etc/apache2/.htpasswd o /etc/nginx/.htpasswd. Establece permisos 640 (chmod 640) y asígnalo al usuario con el que se ejecuta el servidor web (por ejemplo www-data o nginx), para que el servidor pueda leerlo pero otras cuentas no.
¿Cómo configuro Basic Auth en .htaccess / nginx?
Para Apache, esta herramienta genera un bloque .htaccess con AuthType Basic, AuthName, AuthUserFile apuntando a tu ruta .htpasswd y Require valid-user. Para nginx, genera un bloque location con auth_basic "Restricted"; y auth_basic_user_file /ruta/.htpasswd;. Copia el bloque de configuración que corresponda a tu servidor, ajusta la ruta del archivo y recarga — los fragmentos están listos para pegar.
¿Se suben mis contraseñas a algún servidor?
No. Todos los hashes se calculan íntegramente en tu navegador usando JavaScript — ningún nombre de usuario, contraseña ni hash generado se envía por la red. Puedes confirmarlo abriendo las Herramientas de desarrollador del navegador (F12 → pestaña Red) mientras generas: no hay ninguna solicitud saliente. Nada se almacena ni se registra en ningún servidor, por lo que es seguro generar credenciales de producción reales aquí.
¿Cuál es la diferencia entre $2a$, $2b$ y $2y$ en bcrypt?
Son prefijos de versión del mismo algoritmo bcrypt y producen hashes equivalentes; las diferencias tienen su origen en correcciones históricas de errores relacionados con el tratamiento de caracteres de bits altos y la longitud de cadenas en distintas implementaciones. El htpasswd de Apache emite $2y$. Las bibliotecas bcrypt modernas tratan $2a$, $2b$ y $2y$ como intercambiables para la verificación, por lo que una entrada $2y$ generada aquí se validará correctamente en Apache, Caddy, Traefik y Docker Registry.
¿Qué coste de bcrypt debo usar?
El coste 12 es el valor predeterminado moderno y un buen equilibrio entre seguridad y velocidad. El coste es un factor de trabajo: cada incremento duplica el tiempo para calcular y verificar el hash, lo que ralentiza los ataques de fuerza bruta pero también añade latencia a cada inicio de sesión. El coste 10 es aceptable para endpoints de bajo tráfico o bajo riesgo; entre 12 y 14 se recomienda para cualquier cosa sensible. Evita subir tanto el coste que la autenticación legítima se vuelva notablemente lenta.
htpasswd vs la cabecera Authorization: Basic — ¿cuál es la diferencia?
Están en extremos opuestos del mismo intercambio. El archivo .htpasswd contiene el hash almacenado del lado del servidor — un resumen unidireccional que el servidor usa para verificar las credenciales. La cabecera Authorization: Basic es la credencial de solicitud del lado del cliente: el base64 literal de usuario:contraseña que el navegador o curl envía en cada petición. El servidor decodifica el base64 de la cabecera y luego comprueba la contraseña contra el hash almacenado. Uno es almacenamiento; el otro es transporte.
No tengo apache2-utils instalado — ¿cómo genero una entrada htpasswd?
No lo necesitas — esta herramienta genera entradas bcrypt, apr1 y SHA-1 válidas íntegramente en tu navegador. Si prefieres la línea de comandos, OpenSSL está disponible en casi todos los sistemas: ejecuta openssl passwd -apr1 para producir un hash apr1 y luego añade usuario: al principio para formar la línea. En Debian/Ubuntu también puedes instalar el binario htpasswd con apt install apache2-utils, o httpd-tools en RHEL/CentOS.
¿Qué significan las opciones -B, -Bbn y -bnB de htpasswd?
Cada letra es una opción independiente: -B selecciona bcrypt, -n imprime el resultado en stdout en lugar de escribir un archivo, y -b toma la contraseña como argumento de línea de comandos (en lugar de solicitarla). El orden no importa, por lo que -Bbn y -bnB son idénticos. -Bbn es la combinación habitual para redirigir una entrada bcrypt a un archivo htpasswd de Docker Registry.
¿Por qué Docker Registry requiere bcrypt?
El backend de autenticación htpasswd de Docker Registry solo acepta entradas en formato bcrypt; los hashes apr1, SHA-1 y crypt son rechazados y el inicio de sesión fallará. Genera la entrada con htpasswd -Bbn usuario contraseña (o usa la opción bcrypt aquí), monta el archivo en el contenedor del registro y apunta REGISTRY_AUTH_HTPASSWD_PATH a él. Combina siempre esto con TLS, ya que las credenciales de Basic Auth son legibles en tránsito si no hay cifrado.
¿Es segura la autenticación Basic Auth?
Solo sobre HTTPS. HTTP Basic Auth envía las credenciales como base64(usuario:contraseña) en cada solicitud, y base64 es una codificación reversible — no un cifrado — por lo que cualquiera que pueda leer el tráfico puede recuperar la contraseña al instante. Sobre TLS, la cabecera se cifra en tránsito y Basic Auth es aceptable para control de acceso simple. Nunca lo uses en HTTP plano y prefiere esquemas más sólidos para aplicaciones de alto valor.

Herramientas relacionadas

Ver todas las herramientas →

Generador y constructor de comandos cURL

Web & API

Construye comandos curl en tu navegador: define método, cabeceras, autenticación y cuerpo, y obtén el comando listo para copiar al instante. Presets para Bearer, POST JSON y subida de archivos. Gratis, privado, sin registro.

Conversor de Bases — Binario, Hex, Decimal, Octal

Herramientas de Conversión

Convierte números entre binario, hexadecimal, decimal, octal y cualquier base personalizada (2-36) al instante. Gratis, privado, sin registro — todo el procesamiento ocurre en tu navegador.

Decodificador y Codificador Base64

Codificación y Formato

Decodifica y codifica Base64 online de forma gratuita. Conversión en tiempo real con soporte completo de UTF-8 y emojis. 100% privado — funciona en tu navegador. Sin registro.

Convertidor de Mayúsculas, Minúsculas, camelCase y Más

Procesamiento de Texto

Convierte texto entre UPPERCASE, lowercase, Title Case, Sentence case, camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE y 6 formatos más al instante. Gratis, en el navegador, sin registro.

Convertidor de Color — HEX, RGB, HSL y OKLCH

Herramientas de Conversión

Convierta HEX a RGB, HSL, OKLCH, OKLAB y CMYK en su navegador — copie cualquier formato con un clic. Gratis, sin registro, sus colores nunca salen de la página.

Generador Crontab y Constructor de Expresiones Cron

Fecha y Hora

Construye, valida y decodifica expresiones cron en el navegador. Vista previa de próximas ejecuciones en hora local o UTC. POSIX 5 campos, presets y descripción natural. Gratis y privado.