Generator .htpasswd
Utwórz wpis użytkownika z hashem bcrypt i podłącz go do Basic Auth jedną dyrektywą w .htaccess.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator .htpasswd — hasło do Basic Auth w Apache i Nginx
Generator .htpasswd tworzy jedną linię w formacie użytkownik:hash, gotową do wklejenia w plik .htpasswd. Hasło jest hashowane bcryptem, opcjonalnie starszym SHA-1 w formacie Apache {SHA}, a serwer pyta o nie każdego, kto próbuje otworzyć chroniony katalog.
Co dokładnie robi to narzędzie
Podajesz nazwę użytkownika i hasło, wybierasz algorytm i dostajesz pojedynczy wpis. Nazwa może zawierać litery, cyfry, kropkę, podkreślenie i myślnik — dwukropek jest zabroniony, bo w pliku rozdziela on login od hasha. Samo hasło nie jest nigdzie zapisywane ani zapamiętywane w historii: liczony jest hash i tylko on wraca do przeglądarki. Każde kliknięcie daje inny hash bcrypt, bo do hasła dokładana jest losowa sól — wszystkie weryfikują to samo hasło.
Mocne hasło weźmiesz z generatora haseł, a gotowy wpis porównasz z hasłem w weryfikatorze hashy bcrypt.
Gdzie umieścić plik .htpasswd
Nigdy w katalogu publicznym. Jeśli plik trafi do public_html, przy byle pomyłce w konfiguracji serwer wyda go jako zwykły tekst i cała lista hashy wypłynie przez przeglądarkę. Trzymaj go poziom lub dwa wyżej niż DocumentRoot, na przykład jako /home/user/private/.htpasswd albo /etc/apache2/.htpasswd. Uprawnienia ustaw wąsko: zapis dla właściciela, czytanie dla użytkownika serwera, nic dla reszty świata.
Dlaczego bcrypt, a nie MD5, crypt czy SHA-1
Format .htpasswd dopuszcza kilka algorytmów, a różnią się one o rzędy wielkości odpornością na łamanie offline. Gdy plik wycieknie, liczy się tylko to, jak kosztowne jest sprawdzenie jednego kandydata na hasło.
| Algorytm | Wpis zaczyna się od | Ocena |
|---|---|---|
| bcrypt | $2y$12$ | Zalecany: regulowany koszt, sól w hashu, celowo wolny |
| MD5 APR1 | $apr1$ | Domyślny w htpasswd, ale 1000 iteracji MD5 to dziś za mało |
| SHA-1 | {SHA} | Bez soli, jeden przebieg — wyłącznie dla zgodności |
| crypt DES | 13 znaków bez prefiksu | Bierze tylko 8 pierwszych znaków hasła, złamany |
| plaintext | hasło jawnym tekstem | Nie używać w żadnym scenariuszu |
Narzędzie generuje bcrypt z kosztem 12, czyli 4096 przebiegów rozwijania klucza. Dla porównania htpasswd -B domyślnie używa kosztu 5. Apache obsługuje bcrypt od wersji 2.4.4. Pamiętaj też, że bcrypt bierze pod uwagę tylko pierwsze 72 bajty hasła — dłuższe narzędzie odrzuca, zamiast po cichu ucinać końcówkę. Inne funkcje skrótu policzy generator hashy kryptograficznych.
Wpis w .htaccess krok po kroku
- Zapisz wygenerowaną linię w pliku
.htpasswdpoza katalogiem publicznym. - W katalogu, który chcesz chronić, utwórz plik
.htaccessz czterema dyrektywami z przykładu poniżej. - W
AuthUserFilepodaj pełną ścieżkę systemową, nigdy adres URL ani ścieżkę względną. - Sprawdź, czy host ma
AllowOverride AuthConfig. Bez tego Apache w ogóle nie zajrzy do Twojego pliku. - Odśwież stronę. Przeglądarka pokaże okno logowania, a po błędnym haśle dostaniesz status 401.
AuthType Basic AuthName "Strefa chroniona" AuthUserFile /home/user/private/.htpasswd Require valid-user
Nazwa z AuthName pojawia się w okienku przeglądarki i wyznacza realm, więc opisz nią zasób, a nie hasło. Szerszą konfigurację katalogu złożysz w generatorze pliku .htaccess.
Basic Auth bez HTTPS wysyła hasło jawnie
Authorization: Basic z ciągiem login:hasło zakodowanym w base64, a base64 to kodowanie, nie szyfrowanie. Każdy, kto podsłucha ruch, odczyta hasło jednym poleceniem. Takie zasoby udostępniaj wyłącznie przez HTTPS.Do tego nagłówek leci przy każdym żądaniu, więc podczas jednej wizyty hasło przechodzi przez sieć dziesiątki razy. Wylogowania w Basic Auth praktycznie nie ma: przeglądarka pamięta poświadczenia aż do zamknięcia okna. Stan certyfikatu potwierdzisz w weryfikatorze certyfikatu SSL.
To samo ustawienie w Nginx
Nginx czyta ten sam format pliku, tylko konfiguruje się go inaczej: w bloku server albo location wpisujesz auth_basic "Strefa chroniona"; oraz auth_basic_user_file /home/user/private/.htpasswd;. Jest jedna pułapka. Nginx samodzielnie obsługuje wyłącznie APR1, a pozostałe formaty przekazuje systemowej funkcji crypt(). Bcrypt zadziała więc tam, gdzie biblioteka systemowa go zna, czyli na dystrybucjach z libxcrypt. Na starszym serwerze wybierz w narzędziu SHA-1. Wyjątki dla pojedynczych ścieżek ułożysz w konfiguratorze bloków location.
Najczęściej zadawane pytania
Dlaczego hash bcrypt zmienia się przy każdym generowaniu?
Bo bcrypt dokłada do hasła losową sól, a zapisuje ją w środku wynikowego ciągu. Dwa hashe tego samego hasła wyglądają zupełnie inaczej i oba weryfikują się poprawnie. Gdyby hash był zawsze identyczny, jedna tablica tęczowa pozwoliłaby odgadnąć hasła wszystkich użytkowników naraz.
Jak dodać kolejnych użytkowników do pliku?
Każdy użytkownik to osobna linia w formacie login:hash. Wygeneruj wpisy jeden po drugim i wklej je pod siebie, bez pustych linii i bez spacji wokół dwukropka. Loginy muszą być unikalne, bo Apache używa pierwszego pasującego wpisu i po cichu ignoruje duplikaty.
Czy moje hasło gdzieś zostaje?
Nie. Hasło służy tylko do policzenia hasha w trakcie żądania. Nie zapisujemy go w bazie, w plikach ani w historii narzędzi — do historii trafia wyłącznie informacja o użytym algorytmie.
Apache zwraca błąd 500 albo w ogóle nie pyta o hasło. Co sprawdzić?
Najczęściej to zła ścieżka w AuthUserFile lub brak prawa czytania pliku dla użytkownika serwera. Drugi typowy powód to AllowOverride None w konfiguracji wirtualnego hosta, przy którym plik .htaccess jest pomijany bez ostrzeżenia. Trzeci to bcrypt na serwerze starszym niż Apache 2.4.4. Konkretny powód zawsze wpisuje error log.
Czy .htpasswd wystarczy do ochrony panelu administracyjnego?
Jako dodatkowa warstwa przed logowaniem aplikacji jest bardzo skuteczny, bo odcina boty jeszcze przed uruchomieniem kodu PHP. Jako jedyne zabezpieczenie ma braki: nie zna blokady po nieudanych próbach, nie obsługuje drugiego składnika i nie pozwala wylogować użytkownika. Do wrażliwych paneli dołóż uwierzytelnianie w aplikacji, ograniczenie po adresie IP i limit żądań.