So entsteht die Zeile
Eine .htpasswd-Datei enthält einen Benutzer pro Zeile: den Namen, einen Doppelpunkt und einen Hash des Passworts. Der Webserver hasht, was ein Besucher eingibt, mit demselben Salt und vergleicht das Ergebnis, sodass das Passwort selbst nie gespeichert wird.
Zeile = Benutzer:$apr1$Salt$Hash Salt = 8 Zufallszeichen aus ./0-9A-Za-z Hash = MD5 aus Passwort und Salt, 1.000-mal wiederholt
APR1 ist das MD5-basierte Verfahren von Apache, das htpasswd -m schreibt und das Apache und Nginx auf jedem System lesen. Die Seite berechnet es in Ihrem Browser mit einem zufälligen Salt, sodass dasselbe Passwort jedes Mal eine andere Zeile ergibt und beide gültig sind. bcrypt (htpasswd -B) ist langsamer zu erraten, lässt sich aber ohne große Bibliothek nicht in einem Browser berechnen: Führen Sie dafür den oben gezeigten Befehl auf dem Server aus.
Beispiel
Der Benutzer admin mit dem Passwort hunter2 und dem Salt ./AZaz09 ergibt admin:$apr1$./AZaz09$8b6dJ.Cy04zF2N.GdzCEo1, dieselbe Zeile, die openssl passwd -apr1 -salt ./AZaz09 hunter2 ausgibt.
Fragen
Wohin lege ich die .htpasswd-Datei?
Außerhalb der Ordner, die Ihre Website ausliefert, damit niemand sie herunterladen kann: /etc/nginx/.htpasswd oder /etc/apache2/.htpasswd sind üblich. Machen Sie sie nur für den Webserver lesbar, zum Beispiel mit Besitzer root, Gruppe www-data und Modus 640.
Soll ich bcrypt oder APR1 verwenden?
bcrypt ist stärker gegen jemanden, der die Datei stiehlt, und Apache 2.4 liest es; Nginx liest es, wo die Crypt-Bibliothek des Systems es unterstützt, wie bei den meisten aktuellen Linux-Distributionen. APR1 funktioniert überall. Bei einem langen Zufallspasswort ist beides in Ordnung, denn das Passwort, nicht der Hash, verhindert das Erraten.
Braucht die Basic-Authentifizierung HTTPS?
Ja. Der Browser sendet Benutzername und Passwort mit jeder Anfrage, nur Base64-kodiert und nicht verschlüsselt. Ohne HTTPS kann jeder auf dem Netzwerkweg sie lesen. Ein kostenloses Let's-Encrypt-Zertifikat genügt.
Unterstützt Nginx .htpasswd-Dateien?
Ja, mit auth_basic und auth_basic_user_file in einem server- oder location-Block, wie oben gezeigt. Nginx liest keine .htaccess-Dateien, daher kommt die Konfiguration in die Konfiguration der Website, gefolgt von nginx -t und einem Reload.