Генератор htpasswd

Сгенерируйте строку .htpasswd с хешем SHA-1 прямо в браузере, получите готовый блок .htaccess для Apache 2.4 с Require valid-user и команду htpasswd для сервера.

Всё работает в вашем браузере — данные не отправляются на сервер.

Зачем нужен генератор .htpasswd

Файл .htpasswd — это простой текстовый файл, в котором лежат логины и хеши паролей для базовой аутентификации Apache. Он закрывает каталог, страницу или API одним словом «Require valid-user», без единой строчки кода. Проблема в другом: файл нельзя придумать на лету, пароль надо захешировать, а на сервере для этого обычно стоит Apache. Если htpasswd Apache под рукой нет, а задача срочная, остаётся считать хеш в браузере — именно это и делает этот htpasswd generator. Здесь получается строка файла и готовый блок .htaccess, который можно положить рядом и сразу заработать. Сразу оговорка: то, что считается в браузере, — это SHA-1, а для новых сайтов правильный выбор bcrypt, и его считают на сервере.

Что умеет генератор

  • Ввод логина и пароля с проверкой: двоеточие и пробелы в логине недопустимы
  • Расчёт хеша SHA-1 в браузере через Web Crypto и выдача строки вида «логин:{SHA}…» — тем же алгоритмом, что и в генераторе SHA-1
  • Режим bcrypt с готовой командой htpasswd, потому что в браузере его считать дорого
  • Готовый блок .htaccess для Apache 2.4 с Require valid-user и путём к файлу паролей
  • Копирование строки, команды и блока в буфер обмена в один клик, плюс генератор паролей для самого пароля

Как получить файл паролей

  1. Введите логин и пароль, при желании сгенерируйте случайный пароль кнопкой рядом
  2. Выберите алгоритм: SHA-1 считается здесь, bcrypt — на сервере
  3. Нажмите «Сгенерировать строку htpasswd» и скопируйте результат
  4. Положите строку в файл .htpasswd на сервере и добавьте блок .htaccess из раздела ниже

Из чего состоит строка .htpasswd

Формат предельно простой: одна строка на пользователя, логин, двоеточие, хеш, перевод строки. Строки, которые начинаются с решётки, считаются комментариями и игнорируются. Сама строка не шифруется, а хешируется, и алгоритм задаётся префиксом. Схема {SHA} означает SHA-1, записанный в base64 — тем же способом считает и инструмент для SHA-1, а про несколько хешей разом есть отдельная страница: ровно 28 символов после префикса, это 20 байт хеша. Схема $apr1$ — это Apache MD5, вариант crypt с собственной солью и тысячей итераций. Схемы $2y$, $2a$ и $2b$ — это bcrypt, где соль и стоимость встроены в саму строку. Проверка пароля делается на сервере: Apache читает файл, находит строку по логину, применяет указанный алгоритм к введённому паролю и сравнивает результат.

Форматы паролей, которые понимает Apache

СхемаКак выглядит строкаКомментарий
{SHA}admin:{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=SHA-1 в base64, без соли, устаревший формат
$apr1$admin:$apr1$<соль>$<хеш>Apache MD5, своя соль и тысяча итераций
$2y$admin:$2y$05$<22 символа соли><31 символ хеша>bcrypt, стоимость задаётся ключом -C
$2a$admin:$2a$05$<соль><хеш>bcrypt, старая запись варианта, попадается у сборок PHP
$2b$admin:$2b$05$<соль><хеш>bcrypt, текущий вариант с исправлениями в коде
Открытый текстadmin:secretApache не считает это паролем, такая строка утечёт сама
Комментарий# служебная строкаСтроки с решёткой игнорируются при чтении файла

В примерах со схемами $2y$, $2a$ и $2b$ показана структура строки, а не настоящий хеш: подставить можно только результат, полученный на сервере.

Где htpasswd нужнее всего

Первый сценарий — закрыть служебный раздел сайта: статистика, бэкапы, админка, черновики, API с ключом. Второй — закрыть отдельный каталог на статическом хостинге, где нет ни PHP, ни панели управления, и единственный доступный механизм это .htaccess. Третий — поднять временный доступ к материалам для клиента или подрядчика на несколько дней и потом отозвать его одной правкой файла. Четвёртый — устаревшее приложение, которому нужен файл паролей в формате, который ожидает конкретная программа, а не сам Apache.

Отдельно стоит вариант с htpasswd Apache на уровне сервера, а правила для .htaccess разобраны в подробной инструкции по .htaccess: когда нужно завести учётную запись для скрипта или для CI, которая ходит на сайт по basic-аутентификации. Тогда файл паролей становится машинным секретом, и к нему предъявляются требования к хранению, как к любому паролю. В таких случаях удобнее сгенерировать файл на сервере и отдать его в менеджер секретов, а не держать в репозитории. Про генератор .htaccess — там собираются правила редиректов, HTTPS и запрета доступа, которые обычно идут в одном файле.

  • Закрыть служебный каталог: статистика, бэкапы, черновики
  • Защита папки на статическом хостинге, где нет других механизмов
  • Временный доступ к материалам для клиента или подрядчика
  • Учётные записи для скриптов, CI и мониторинга
  • Совместимость со старым приложением, ждущим готовый файл паролей

Частые ошибки при настройке htpasswd

Самая частая — перенести блок из Apache 2.2 на сервер 2.4 и удивляться, что защита не работает или, наоборот, пускает всех. Второе место — указать в AuthUserFile относительный путь или путь от каталога сайта: Apache ждёт абсолютный путь от корня файловой системы. Третье — забыть про права на файл и положить его в общий каталог, доступный по HTTP, тогда файл паролей скачает кто угодно.

Дальше — попытка угадать пароль по схеме {SHA}: это безнадёжно, потому что функция односторонняя. Ещё ошибка — сгенерировать строку с паролем в открытом виде и записать её в файл: Apache её не примет. И последняя — забыть про HTTPS: при basic-аутентификации логин и пароль передаются в base64, то есть почти в открытом виде, и без шифрования канала их перехватят по дороге. Пароль по HTTPS всё равно стоит передавать, но он хотя бы не лежит на проводе.

  • Перенести блок с Order и Deny на сервер Apache 2.4
  • Указать в AuthUserFile относительный путь
  • Положить файл паролей в каталог, доступный по HTTP
  • Пытаться подобрать пароль, зная его SHA-1
  • Включить basic-аутентификацию без HTTPS

Разбор примера: как собрать работающую связку

Шаг первый — пароль. Вводим его в поле и получаем строку вида admin:{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=. Это base64 от двадцати байт хеша SHA-1, и именно в таком виде Apache ожидает увидеть пароль в файле. Логин в строке пишется ровно тот, который вводили при входе, и двоеточие в нём использовать нельзя — иначе строка распадётся на части не там.

Шаг второй — файл на сервере. Создаём его командой htpasswd -c, вставляем сгенерированную строку, ставим права 640 и выдаём владельца веб-серверу. Шаг третий — .htaccess рядом с защищаемым каталогом: четыре директивы, Require valid-user, и путь к файлу паролей. Шаг четвёртый — проверка: открыть защищённый адрес и убедиться, что сервер спросил логин и что вход работает.

Что происходит на каждом шаге

ШагДействиеРезультат
1Ввод логина и пароляпроверяется, что в логине нет двоеточия и пробелов
2Подсчёт хешаWeb Crypto даёт 20 байт SHA-1 от пароля в UTF-8
3Кодирование в base6420 байт превращаются в 28 символов с «=» на конце
4Сборка строкилогин, двоеточие, префикс {SHA} и хеш
5Запись в файлстрока кладётся в .htpasswd на сервере
6Указание путиAuthUserFile получает абсолютный путь к файлу
7Права доступа640 на файл и 750 на каталог, владелец — веб-сервер
8Проверка входаApache запрашивает пароль и сверяет хеш

Шаги с второго до четвёртого выполняет браузер, остальное — на сервере, где Apache и должен проверять пароль.

Apache 2.2 и 2.4, Require и Order, HTTP и HTTPS

Главное отличие между поколениями Apache — в синтаксисе авторизации. В 2.2 доступ описывался списком правил: Order allow,deny задавал порядок просмотра, Allow from all или Deny from перечисляли адреса, а замыкала всё конструкция Require. В 2.4 осталась только Require, и правила применяются одновременно, а не по очереди. Отсюда практический совет: если сервер на 2.4, берите Require valid-user, если на 2.2 — не выбрасывайте Order и Deny, пока не переехали.

Второе отличие — транспорт. Basic-аутентификация отправляет логин и пароль в заголовке Authorization, закодированные в base64, то есть без всякого шифрования. По HTTP это значит, что пароль виден любому, кто слушает канал. HTTPS здесь не улучшение, а обязательное условие: иначе защита работает только против тех, кто не читает сеть. Третье отличие касается формата файла: Apache 2.4 умеет работать и с файлами паролей, созданными в других программах, — тут важно только, чтобы схема хеша была той, которую сервер умеет проверять.

  • Apache 2.4: Require valid-user вместо Order, Allow и Deny
  • Apache 2.2: старый синтаксис ещё обязателен до перехода
  • Basic-аутентификация без HTTPS передаёт пароль почти в открытом виде
  • Формат файла паролей должен совпадать с тем, что умеет проверять сервер
  • Схема {SHA} без соли выдаёт одинаковые хеши для одинаковых паролей

Частые вопросы про htpasswd и Apache

Почему bcrypt считается на сервере, а не в браузере?

Потому что bcrypt специально медленный. Он внутри выполняет тысячи раундов ключевого расчёта, и именно эта медленность делает перебор дорогим: чем больше раундов, тем больше времени занимает одна проверка. В браузере такая задача блокирует интерфейс на секунды и повторяет ту же работу, которую сервер всё равно выполнит при входе. Плюс к тому в браузере нет реализации bcrypt без внешней библиотеки, а тянуть библиотеку ради одного хеша не хочется. Отсюда решение: SHA-1 считается в браузере через Web Crypto, а для bcrypt даётся готовая команда, которую достаточно выполнить на сервере.

Что такое Require valid-user и почему не Order и Deny?

Require valid-user — это директива авторизации Apache 2.4: она говорит «пропустить пользователя, если он есть в файле паролей». Старый синтаксис из Apache 2.2 выглядел как Order allow,deny вместе с Allow from all и Deny from, и описывал доступ списком правил. В версии 2.4 эти три директивы убрали полностью, а новые Require работают иначе: правила не выстраиваются по порядку, а применяются все сразу. Старый блок, перенесённый как есть, либо перестаёт работать, либо начинает пускать всех подряд. Если сервер ещё на 2.2, блок с Order и Deny по-прежнему обязателен, но переводить такие сайты на 2.4 всё равно разумнее.

Чем bcrypt лучше SHA-1 для паролей?

Тремя вещами. Первое — соль: bcrypt генерирует её для каждого пароля и хранит внутри строки, поэтому два одинаковых пароля дают разные хеши, и по файлу не видно, у кого один и тот же пароль. В схеме {SHA} соли нет вовсе. Второе — скорость: SHA-1 считается миллиардами раз в секунду на видеокарте, bcrypt с настройкой по умолчанию — сотни раз в секунду на процессоре, и разрыв такой, что перебор становится непрактичным. Третье — настраиваемая стоимость: её можно поднимать по мере того, как железо становится быстрее. Про надёжный пароль и разницу между хешами MD5 и SHA-256 стоит почитать отдельно.

Как правильно узнать пароль, если в .htpasswd лежит SHA-1?

Никак, если это bcrypt, и вот почему. В схеме {SHA} пароль проверяется просто: посчитали SHA-1 от введённого пароля, сравнили с базой в base64, и если совпало — пароль верный. С bcrypt так не выйдет: там внутри строки лежит соль, стоимость и результат тысячи итераций, а сам пароль не хранится ни в каком виде. Узнать его можно только перебором по словарю, перебирая возможные пароли и сравнивая результат с сохранённым хешем. Именно поэтому, если пароль утерян, его не «вспомнить», а сбросить: заменить строку в файле на новую.

Куда класть .htpasswd и какие права ставить?

Файл обычно кладут рядом с защищаемым каталогом или выше по дереву, а имя делают таким, чтобы его не подобрали: .htpasswd — обычное имя, но и htpasswd.bak тоже встречается. Права важны сильнее имени: файл с паролями не должен быть доступен на чтение постороннему пользователю, поэтому каталог с ним закрывают правами 750, а сам файл — 640, с владельцем из того пользователя, под которым работает веб-сервер. Если положить файл в корень сайта, куда есть доступ по HTTP, имя должно начинаться с точки.

Можно ли хранить пароль в открытом виде?

Apache так не сделает: строка с паролем без хеша не считается паролем, и аутентификация не сработает. Но если такую строку всё же создать вручную, пароль утечёт при первом же бэкапе, при первом же попадании файла в репозиторий и при любом просмотре каталога. Вариант с ключом -p в htpasswd существует только для Windows и для тестов, и в боевом файле паролей ему не место. Если нужен именно такой формат — например, чтобы сравнить с другой системой, — строка выдаётся с пометкой, что это открытый текст, а не хеш.

Почему при входе на сайт Apache отвечает кодом 500?

Чаще всего потому, что не задана директива AuthName, или путь в AuthUserFile указан неверно. Apache требует полного комплекта: AuthType Basic, AuthName с названием области, AuthUserFile с абсолютным путём и Require valid-user. Без AuthName сервер не запускает защиту и падает с внутренней ошибкой. Ещё частая причина — путь: он задаётся от корня файловой системы, а не от каталога сайта, и относительные пути Apache не принимает. Третья причина — сам файл недоступен учётной записи веб-сервера: права 640 с чужим владельцем дают ту же ошибку 500.

Как заменить пароль существующему пользователю?

Файл .htpasswd можно править текстовым редактором: это обычный текст, и новая строка просто заменяет старую. Либо на сервере: команда htpasswd с путём к файлу и именем пользователя спросит новый пароль и перезапишет соответствующую строку, не трогая остальные. Если пользователей много, менять их по одному неудобно, и тогда проще сгенерировать файл заново с ключом -c и раздать каждому свою строку. Важный момент: пока вы не положили новый файл на место и не проверили вход, старый не удаляйте.

Похожие инструменты

Генератор robots.txt

Соберите robots.txt для своего сайта: правила обхода, запрет служебных папок, Clean-param и Host для Яндекса, строка Sitemap

Генератор sitemap.xml

Соберите валидный sitemap.xml из списка URL или CSV: lastmod, changefreq, priority, проверка лимитов и скачивание файла

Генератор favicon

Сделайте иконку сайта из монограммы или своей картинки: favicon.ico, apple-touch-icon, android-chrome-192 и 512, site.webmanifest и готовый HTML-код

Генератор JSON Schema

Постройте черновую JSON Schema по примеру JSON: типы полей, required, вложенные объекты и массивы

Генератор регулярных выражений

Соберите регулярное выражение по шаблону задачи или разберите своё выражение на конструкции

Генератор Open Graph

Соберите теги og:title, og:description, og:image и Twitter Card для превью ссылки в соцсетях

Таблица ASCII-кодов

Полный справочник ASCII: коды 0–127 в DEC, HEX, OCT и BIN с поиском по символу или коду

Тестер и отладчик регулярных выражений

Тестируйте регулярные выражения с подсветкой совпадений, группами и частыми паттернами