📚 Qué es el archivo .htpasswd
El .htpasswd es un archivo de texto que guarda los usuarios y contraseñas con los que el servidor protege una carpeta o una web entera con la autenticación básica de HTTP: la ventanita del navegador que pide usuario y contraseña antes de enseñar nada. Lo leen Apache (módulos mod_auth_basic y mod_authn_file) y nginx (auth_basic).
Tiene una línea por usuario, con el nombre y la contraseña cifrada separados por dos puntos:
admin:$2y$10$Yh2b… maria:$apr1$Qx8… cliente:$6$k3…
El servidor nunca guarda la contraseña, solo su hash: cuando alguien entra, cifra lo que ha escrito con el mismo método y compara. Por eso cada línea puede usar un cifrado distinto: el prefijo ($2y$, $apr1$, $6$, {SHA}) le dice al servidor cuál es.
🧭 Cómo funciona por dentro
- El navegador pide la página y el servidor responde
401 Unauthorizedcon la cabeceraWWW-Authenticate: Basic realm="…". - El navegador muestra la ventana y, a partir de ahí, manda en cada petición la cabecera
Authorization: Basic …con usuario y contraseña en Base64. - Base64 no es cifrado, solo una codificación: cualquiera que intercepte el tráfico lo lee. Úsalo siempre con HTTPS.
🎯 Para qué se usa (y qué tiene que ver con el SEO)
- Entornos de pruebas o staging. Es la forma más segura de que una copia de la web no acabe en Google: Googlebot recibe un 401 y no puede leer nada. Un
Disallowen el robots.txt no impide que la URL se indexe, y una etiquetanoindexobliga a dejar rastrear; la contraseña corta las dos cosas de raíz. - Webs en desarrollo antes del lanzamiento, o secciones privadas para clientes.
- Una capa extra delante de
wp-login.phpo/wp-admin/en WordPress, para frenar los ataques de fuerza bruta antes de que lleguen a PHP.
⚠️ Si proteges una web que ya está publicada, Google dejará de poder rastrearla y, con el tiempo, sus páginas saldrán del índice. Y al lanzar una web que estaba protegida, acuérdate de quitar la contraseña.
🔐 Qué cifrado elegir
| Cifrado | Prefijo | Apache 2.4 | nginx | Seguridad |
|---|---|---|---|---|
| bcrypt | $2y$ | ✅ | ✅ con el crypt() del sistema (Linux actual) | 🟢 La mejor: lenta a propósito y con coste ajustable |
| APR1-MD5 | $apr1$ | ✅ (el de htpasswd por defecto) | ✅ | 🟡 Aceptable; rápida de atacar con tarjetas gráficas |
| SHA-512 crypt | $6$ | ✅ en Linux · ❌ en Windows | ✅ | 🟢 Buena, con sal y miles de rondas |
| SHA-1 | {SHA} | ✅ | ✅ | 🔴 Sin sal: solo si no queda otra |
Si no sabes qué servidor tienes, bcrypt es la opción por defecto y APR1-MD5 la que funciona en todas partes. Equivalen a htpasswd -B y htpasswd -m en la terminal; SHA-512 es lo que da openssl passwd -6.
📁 Dónde dejar el archivo
- Fuera de la carpeta pública (por ejemplo
/home/usuario/.htpasswd, al lado depublic_htmly no dentro). Así nadie puede descargarlo aunque falle la configuración. - La ruta de
AuthUserFile(Apache) y deauth_basic_user_file(nginx) tiene que ser absoluta. - Apache bloquea por defecto los archivos que empiezan por
.ht; nginx no, por eso en su fragmento va el bloque que los deniega. - Después de tocar la configuración de nginx hay que recargarlo (
nginx -tysystemctl reload nginx); el.htaccessde Apache se aplica al momento.