Как создаётся строка
Файл .htpasswd хранит по одному пользователю в строке: имя, двоеточие и хеш пароля. Веб-сервер хеширует то, что вводит посетитель, с той же солью и сравнивает результат, поэтому сам пароль нигде не хранится.
строка = пользователь:$apr1$соль$хеш соль = 8 случайных символов из ./0-9A-Za-z хеш = MD5 от пароля и соли, повторённый 1000 раз
APR1 — это схема Apache на основе MD5, которую записывает htpasswd -m и которую читают и Apache, и Nginx в любой системе. Страница считает её в вашем браузере со случайной солью, поэтому один и тот же пароль каждый раз даёт другую строку, и обе действительны. bcrypt (htpasswd -B) подбирать дольше, но без большой библиотеки в браузере его не посчитать: для него выполните на сервере команду, показанную выше.
Пример
Пользователь admin с паролем hunter2 и солью ./AZaz09 даёт admin:$apr1$./AZaz09$8b6dJ.Cy04zF2N.GdzCEo1 — ту же строку, что выводит openssl passwd -apr1 -salt ./AZaz09 hunter2.
Вопросы
Куда положить файл .htpasswd?
Вне папок, которые отдаёт ваш сайт, чтобы никто не мог его скачать: обычно это /etc/nginx/.htpasswd или /etc/apache2/.htpasswd. Сделайте его читаемым только для веб-сервера, например владелец root, группа www-data и режим 640.
Что выбрать: bcrypt или APR1?
bcrypt устойчивее к тому, кто украдёт файл, и Apache 2.4 его читает; Nginx читает его там, где его поддерживает системная библиотека crypt, как в большинстве современных дистрибутивов Linux. APR1 работает везде. С длинным случайным паролем подойдёт любой вариант, потому что угадывание останавливает пароль, а не хеш.
Нужен ли HTTPS для базовой аутентификации?
Да. Браузер отправляет имя пользователя и пароль с каждым запросом, лишь закодированными в base64, но не зашифрованными. Без HTTPS их может прочитать любой на пути трафика. Бесплатного сертификата Let's Encrypt достаточно.
Поддерживает ли Nginx файлы .htpasswd?
Да, через auth_basic и auth_basic_user_file в блоке server или location, как показано выше. Nginx не читает файлы .htaccess, поэтому настройка записывается в конфигурацию сайта, после чего выполняются nginx -t и перезагрузка.