Ir al contenido principal

Generador de hash bcrypt

El formato .htpasswd recomendado, en 3 clics

¿Quieres añadir una cuenta a un fichero .htpasswd con el algoritmo recomendado, sin instalar apache2-utils? Escribe un usuario y una contraseña: la línea en formato $2y$ queda lista para pegar.

El coste es un exponente: cada paso duplica el tiempo de cálculo. 10 es el valor de htpasswd -B y 12 un buen equilibrio hoy en día.

Puntos clave de la herramienta

Formato $2y$ nativo

El hash bcrypt de htpasswd -B, derivado de Blowfish. Compatible con Apache 2.4, nginx, Traefik y Caddy.

Factor de coste ajustable

De 4 a 15, con un cursor. Cada escalón duplica el trabajo exigido a un atacante. 10 por defecto, como htpasswd -B.

Línea lista para pegar

El resultado se muestra como una línea user:hash completa, que puedes copiar directamente a tu fichero .htpasswd.

Sal nueva en cada llamada

bcrypt integra una sal de 128 bits en el hash. Dos cuentas con la misma contraseña dan dos hashes distintos.

No se guarda nada

La contraseña sirve para el cálculo y luego desaparece. Sin rastro en base de datos ni contraseñas en claro en los registros.

¿Por qué generar un hash bcrypt en línea?

La autenticación HTTP Basic sigue siendo la forma más rápida de cerrar un espacio de administración, una preproducción o un cuadro de mando interno. Se apoya en un fichero .htpasswd en el que cada línea asocia un usuario a una contraseña hasheada, nunca en claro.

Desde Apache 2.4, el comando htpasswd -B produce bcrypt, y es el formato que recomienda la documentación oficial. El problema: ese comando requiere haber instalado apache2-utils en Debian o httpd-tools en RHEL. En un equipo Windows, en un alojamiento compartido o desde una interfaz web, suele faltar.

Tres situaciones en las que este generador te saca de un apuro:

  • Proteger una preproducción → Cerrar el acceso a un entorno de pruebas antes de que Google lo indexe
  • Añadir una cuenta sin acceso SSH → Crear la línea desde el navegador y pegarla con el gestor de ficheros de tu alojamiento
  • Modernizar un fichero existente → Sustituir poco a poco las entradas $apr1$ por entradas $2y$

Cómo usar el generador en 3 pasos

Paso 1: introducir el identificador y la contraseña

Escribe el nombre de la cuenta y su contraseña. El campo está oculto por defecto; haz clic en el ojo para releer lo escrito antes de validar. El botón "Generar una contraseña" extrae una cadena aleatoria de 16 caracteres si todavía no tienes una.

Paso 2: ajustar el factor de coste

El cursor parte de 10, el valor de htpasswd -B. Súbelo a 12 para un acceso sensible. Cada escalón duplica el tiempo de cálculo: en la generación y en cada verificación que haga el servidor.

Paso 3: copiar la línea

Se muestran dos resultados: el hash solo y la línea .htpasswd completa. Copia esta última, pégala en tu fichero y recarga la configuración del servidor.


Anatomía de un hash bcrypt

Una línea .htpasswd se divide en dos campos separados por dos puntos:

admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

El segundo campo se descompone así:

ParteEjemploFunción
Identificador de algoritmo2yIndica al servidor que se trata de bcrypt
Factor de coste10Exponente: el cálculo encadena 2^10 = 1.024 rondas
Sal + digestN9qo8uLOickgx2ZMRZoMye...53 caracteres: 22 para la sal de 128 bits, 31 para la huella

A diferencia de APR1-MD5, la sal no ocupa un campo aparte: va pegada al digest en el último bloque. Sigue siendo legible en claro, lo cual es normal: su papel no es ser secreta, sino impedir que una tabla precalculada sirva para recuperar la contraseña.


Entender el factor de coste

El coste es un exponente, no un multiplicador. Un coste de N encadena 2^N rondas de derivación de clave:

CosteRondasTiempo orientativoUso
8256~15 msDemasiado bajo hoy en día
101.024~60 msValor por defecto de htpasswd -B, correcto
124.096~250 msRecomendado para un acceso sensible
1416.384~1 sLatencia perceptible en cada conexión

Dos cosas que tener en cuenta. Primero, ese tiempo se paga en cada verificación, es decir, en cada petición HTTP Basic: un coste de 14 en una página cuyo navegador repite la autenticación en cada recurso se nota enseguida. Segundo, el ajuste correcto depende de tu hardware: mide en lugar de copiar un valor, con el objetivo habitual de 100 a 250 ms en el servidor que hará la verificación.


Proteger un directorio con Apache

1. Crear el fichero

Coloca tu fichero .htpasswd fuera de la raíz web, para que nunca se sirva por HTTP:

/var/www/secrets/.htpasswd

2. Declarar la protección

En el .htaccess del directorio a proteger, o en el bloque <Directory> de tu VirtualHost:

AuthType Basic
AuthName "Zona restringida"
AuthUserFile /var/www/secrets/.htpasswd
Require valid-user

3. Recargar la configuración

sudo apachectl configtest && sudo systemctl reload apache2

Para nginx, el mismo par de ficheros se declara así:

location /admin/ {
    auth_basic           "Zona restringida";
    auth_basic_user_file /var/www/secrets/.htpasswd;
}

nginx lee bcrypt desde la versión 1.0.3 en los sistemas cuya crypt_r() lo soporta, lo que cubre todas las distribuciones Linux habituales.


bcrypt frente a los otros formatos .htpasswd

FormatoPrefijoCoste de cálculoVeredicto
bcrypt$2y$Ajustable, 2^coste rondasRecomendado para cualquier proyecto nuevo
APR1-MD5$apr1$1.000 iteraciones MD5Aceptable, compatibilidad máxima
SHA-1{SHA}1 iteración, sin salA evitar: sin sal, se rompe por tabla
crypt() DESninguno25 iteraciones, truncado a 8 caracteresObsoleto, no usar más

En resumen: bcrypt es el único formato .htpasswd cuyo coste se ajusta al hardware de la época. Los otros tres tienen un coste fijo, decidido en los años 1990 o 2000, que el avance de las GPU ha vuelto ridículo. Conserva el APR1-MD5 solo si tu servidor no sabe leer $2y$.


Verificar el hash desde la línea de comandos

El resultado de esta herramienta es un hash bcrypt estándar, verificable con las utilidades del sistema:

# Generar el equivalente con htpasswd (paquete apache2-utils / httpd-tools)
htpasswd -nbB admin miContraseña

# Imponer un factor de coste de 12
htpasswd -nbB -C 12 admin miContraseña

Las dos cadenas no serán idénticas - la sal difiere en cada extracción -, pero ambas validan la misma contraseña. Para comprobarlo:

# Rehacer la verificación con la sal del hash existente
python3 -c "import bcrypt,sys; print(bcrypt.checkpw(b'miContraseña', sys.argv[1].encode()))" '$2y$10$...'

FAQ - Preguntas frecuentes

P: ¿Qué es el formato $2y$?

R: Es el marcador de bcrypt en un fichero .htpasswd. El hash completo sigue el patrón $2y$<coste>$<sal><digest>: un identificador de algoritmo, un factor de coste de dos cifras y 53 caracteres con la sal de 128 bits y la huella. Es lo que escribe htpasswd -B.


P: ¿Qué diferencia hay entre $2a$, $2b$ y $2y$?

R: Ninguna de fondo: son tres marcadores del mismo algoritmo. $2y$ lo introdujo PHP en 2011 para señalar una implementación corregida de un error con los caracteres no ASCII, error ausente de la biblioteca usada aquí. Apache y nginx aceptan los tres.


P: ¿Qué factor de coste elegir?

R: 10 por defecto, 12 para un acceso sensible. El reflejo correcto es medir en el servidor que hará la verificación y apuntar a 100-250 ms: bastante lento para frenar un ataque por diccionario, bastante rápido para no notarse en el uso diario.


P: ¿Por qué no puedo superar 15?

R: Como el coste es un exponente, 16 ya exige varios segundos de cálculo y superaría el tiempo asignado a una petición HTTP. Para un coste mayor, genera el hash en local con htpasswd -B -C 18.


P: ¿Es bcrypt mejor que APR1-MD5?

R: Sí, claramente. APR1-MD5 encadena 1.000 iteraciones de MD5, que el hardware especializado calcula por miles de millones por segundo. bcrypt exige memoria y accesos no secuenciales, lo que limita mucho el paralelismo de una GPU. Para un fichero .htpasswd nuevo, bcrypt sin dudarlo.


P: ¿Puedo usar una contraseña de más de 72 caracteres?

R: No, y no es un límite de esta herramienta: bcrypt ignora sin más todo lo que supere 72 bytes. Una contraseña de 80 caracteres equivaldría, por tanto, a sus 72 primeros. Ojo, un carácter acentuado cuenta como dos bytes en UTF-8.


P: ¿Se guarda la contraseña en algún sitio?

R: No. Viaja por HTTPS hasta la API de CaptainDNS durante el cálculo y luego se olvida. Ni base de datos ni registro con la contraseña en claro.


P: ¿Dónde debe estar el fichero .htpasswd?

R: Fuera de la raíz web, por ejemplo en /var/www/secrets/. Si está en un directorio servido por HTTP, un visitante podría descargarlo y atacar los hash sin conexión, que es precisamente lo que el factor de coste encarece, aunque no imposibilita.


Herramientas complementarias

HerramientaUtilidad
Generador APR1-MD5Producir una línea .htpasswd en el formato histórico de Apache
Generador de contraseñasExtraer una contraseña segura antes de hashearla
Hash GeneratorCalcular MD5, SHA-1, SHA-256 y SHA-512 de un texto
Codificador Base64Codificar la cabecera Authorization de una petición Basic
Analizador de cabeceras HTTPComprobar las cabeceras que devuelve un espacio protegido

Recursos útiles


Compromiso de privacidad

Tu contraseña se envía a la API de CaptainDNS únicamente para calcular el hash, a través de una conexión cifrada. No se almacena ni se registra. Solo se conservan métricas técnicas anónimas (tiempo de procesamiento, código de respuesta).