Cómo se crea la línea
Un archivo .htpasswd contiene un usuario por línea: el nombre, dos puntos y un hash de la contraseña. El servidor web calcula el hash de lo que escribe un visitante con la misma sal y compara el resultado, así que la contraseña en sí nunca se guarda.
línea = usuario:$apr1$sal$hash sal = 8 caracteres aleatorios de ./0-9A-Za-z hash = MD5 de la contraseña y la sal, repetido 1000 veces
APR1 es el esquema de Apache basado en MD5, el que escribe htpasswd -m y que leen Apache y Nginx en cualquier sistema. La página lo calcula en tu navegador con una sal aleatoria, así que la misma contraseña da una línea distinta cada vez y ambas son válidas. bcrypt (htpasswd -B) es más lento de adivinar, pero no se puede calcular en un navegador sin una biblioteca grande: para él, ejecuta en el servidor el comando que se muestra arriba.
Ejemplo
El usuario admin con la contraseña hunter2 y la sal ./AZaz09 da admin:$apr1$./AZaz09$8b6dJ.Cy04zF2N.GdzCEo1, la misma línea que imprime openssl passwd -apr1 -salt ./AZaz09 hunter2.
Preguntas
¿Dónde pongo el archivo .htpasswd?
Fuera de las carpetas que sirve tu sitio, para que nadie pueda descargarlo: /etc/nginx/.htpasswd o /etc/apache2/.htpasswd son habituales. Haz que solo lo pueda leer el servidor web, por ejemplo con propietario root, grupo www-data y modo 640.
¿Debo usar bcrypt o APR1?
bcrypt es más fuerte frente a alguien que robe el archivo, y Apache 2.4 lo lee; Nginx lo lee donde la biblioteca crypt del sistema lo admite, como en la mayoría de las distribuciones Linux actuales. APR1 funciona en todas partes. Con una contraseña aleatoria larga sirven las dos, porque lo que impide adivinar es la contraseña, no el hash.
¿La autenticación básica necesita HTTPS?
Sí. El navegador envía el nombre de usuario y la contraseña con cada petición, solo codificados en base64, no cifrados. Sin HTTPS, cualquiera en el camino de red puede leerlos. Un certificado gratuito de Let's Encrypt basta.
¿Nginx admite archivos .htpasswd?
Sí, con auth_basic y auth_basic_user_file en un bloque server o location, como se muestra arriba. Nginx no lee archivos .htaccess, así que la configuración va en la del sitio, seguida de nginx -t y una recarga.