Как работает Паролька

Сервис про безопасность обязан доказывать свои утверждения, а не обещать. Здесь описано устройство генератора целиком, со ссылками на источники и с указанием, что можно проверить самому.

Пароль не уходит на сервер — и это проверяется

Пароль создаётся прямо в вашем браузере. У сайта нет ни базы данных, ни серверного кода: это несколько статических файлов, которые веб-сервер просто отдаёт как есть.

Проверка за пятнадцать секунд

Откройте генератор. Отключите интернет — Wi-Fi или мобильную сеть, как удобнее. Нажмите «Другой».

Пароль появится. Значит, спрашивать сервер было не у кого: вся генерация уже была на вашем устройстве.

Есть и более строгие способы убедиться:

  • Панель разработчика. Нажмите F12, вкладка «Сеть», нажмите «Другой» несколько раз. Новых запросов не будет — ни одного.
  • Исходный код. Нажмите Ctrl+U или откройте /assets/js/generate.js напрямую. Там нет ни fetch, ни XMLHttpRequest — отправлять пароль просто нечем.
  • Установите как приложение. В браузере есть пункт «Установить приложение». После установки генератор работает полностью офлайн.

Единственный запрос, который делает страница — загрузка словаря /data/words-main.json при открытии. Он одинаков для всех и не зависит от того, какой пароль вы создадите.

Откуда берётся случайность

Слова выбирает crypto.getRandomValues — тот же криптографический генератор, которым браузер защищает соединение с банком и данные вашей карты при оплате.

Мы не используем Math.random. Это принципиально: Math.random не предназначен для криптографии, его вывод предсказуем, и пароли на его основе восстанавливаются по нескольким известным значениям. К сожалению, некоторые известные генераторы паролей до сих пор построены именно на нём.

Про остаток от деления

Тонкость, которую часто упускают. Если взять случайное 32-битное число и посчитать остаток от деления на размер словаря, распределение получится неравномерным: часть слов будет выпадать чаще остальных. Для словаря на 2048 слов разница ничтожна, но для выбора двузначного числа из ста — уже заметна.

Мы решаем это отбраковкой: числа, попавшие в «неровный хвост» диапазона, выбрасываются и генерируются заново. Равномерность проверяется автоматическим тестом на четырёхсот тысячах выборок по критерию хи-квадрат.

Как собран словарь

Два списка. Основной — 2048 слов, это ровно 11 бит на слово. Короткий — 1024 слова, ровно 10 бит; он используется там, где пароль придётся вводить руками и диктовать.

Круглые числа выбраны намеренно: log₂(2048) = 11 без остатка, поэтому арифметика стойкости остаётся понятной, а не превращается в «10,87 бита на слово».

Короткий список целиком входит в основной. Благодаря этому «усилить пароль» означает «добавить слово», а не «поменять словарь».

Из чего отбирали

Источник — открытый словарь русских существительных (около 27 000 базовых форм) и частотный список словоформ, собранный по субтитрам. Частотность нужна, чтобы в словаре не оказалось слов, которые носитель языка не опознает на слух: «махизм», «онагр», «лабаз» формально существуют, но диктовать их по телефону бессмысленно.

Правила отбора

Первая группа правил отвечает за корректность. Их нельзя ослаблять, они влияют не на удобство, а на то, будет ли пароль работать вообще.

  • Только латиница после транслитерации. Русские буквы негде набрать в BIOS, на телевизорах и приставках, и многие сайты их не принимают. Поэтому слова русские, а буквы латинские.
  • Ни одно слово не является началом другого. Тогда пароль остаётся однозначно разбираемым даже без разделителей. Это правило взято из словарей EFF.
  • Любые два слова различаются минимум в двух буквах. Опечатка в один символ не превращает одно слово словаря в другое — иначе диктовка становилась бы опасной.
  • Нет двух слов с одинаковым транслитом. Иначе один пароль соответствовал бы двум разным русским словам, и подсказка для диктовки была бы неоднозначной.

Вторая группа отвечает за удобство и применяется только к короткому словарю:

  • Длина транслита 4–7 символов.
  • Первые три буквы уникальны — слово узнаётся по началу.
  • Нет букв, спорных на слух: ё и э звучат как е, ы и й оба дают y, мягкий и твёрдый знаки исчезают.
  • Минимум многобуквенных сочетаний вроде zh, sch, ya — они удлиняют ввод.

Что мы убрали

Пароль часто приходится диктовать клиенту, вписывать в акт передачи и показывать коллегам. Поэтому словарь должен быть безопасным не только криптографически, но и социально.

УбралиПочему
Обсценная лексика и производные Фильтр по корням, а не по точным словам — иначе производные проскочат
Смерть, болезни, насилие, оружие Пароль вида morg-gangrena-47 нельзя отдать клиенту
Национальности и этнонимы Нейтральны сами по себе, но в акте передачи читаются как высказывание
Религия и культ То же соображение
Топонимы и личные имена Создают ложную ассоциацию с владельцем аккаунта. Определяются по английскому переводу: если все варианты перевода с заглавной буквы — это имя собственное
Не существительные «левый», «милая», «стать» помечены в словаре существительными, но в пароле читаются как обрывок фразы
Оценочные слова «дура», «трус», «позор» — неуместны в пароле, который вы создаёте для другого человека
Алкоголь, табак, медицинские подробности Неудобно диктовать и незачем

Всего фильтры и ручная вычитка отбросили около 4600 слов из 27 000 кандидатов. Запас достаточный, и мы предпочитаем потерять хорошее слово, чем оставить плохое.

Словарь открыт

Оба списка лежат по адресам /data/words-main.json и /data/words-short.json — их можно открыть и прочитать целиком.

Это не оплошность. Расчёт стойкости уже исходит из того, что словарь известен атакующему. Скрывать список означало бы завышать оценку — то есть врать. Подробнее об этом на странице про биты.

Алгоритм генерации

Каждый шаг сообщает, сколько бит он добавил. Поэтому цифра на странице не подогнана, а посчитана — её можно сверить с описанием.

Шаг Вклад в биты
Каждое слово из словаря log₂(размер словаря): 11 или 10
Две цифры, если включены log₂(100) = 6,64
Случайное место для цифр log₂(количество мест)
Символ, если включён log₂(9) = 3,17
Случайное место для символа log₂(длина − 1)
Заглавные буквы 0 — правило постоянное
Выбор разделителя 0 — это настройка, а не случайность

Символ вставляется внутрь строки, а не в конец: конец строки — первое, что пробуют стандартные правила программ подбора, и там символ почти не добавляет стойкости.

Набор символов ограничен: - _ . ! # $ % @ +. Отобраны те, что есть на всех раскладках, не ломают CSV, URL и командную строку, и однозначно называются при диктовке. Кавычки, обратный слэш, пробел и угловые скобки исключены.

PIN-код проверяется отдельно

Случайные цифры — этого недостаточно. Программа подбора начинает с предсказуемых комбинаций, поэтому мы отбраковываем и генерируем заново, если получилось:

  • все цифры одинаковые: 0000, 1111
  • последовательность: 1234, 9876
  • повтор пары или тройки: 1212, 123123
  • похоже на дату: 3112, 0101, 1990
  • известные комбинации вроде 2580 — это средний столбец клавиатуры сверху вниз

Отбраковка сокращает пространство вариантов, поэтому заявленные биты мы уменьшаем на долю отброшенных комбинаций. Для PIN из четырёх цифр отбраковывается 6,8% всех значений, и стойкость выходит 13,19 бита вместо наивных 13,29. Разница мизерная, но округлять в свою пользу неправильно.

Гораздо важнее другое: PIN короткий по своей природе. Двадцать бит — это меньше, чем даёт одно слово с небольшой добавкой. PIN годится там, где после нескольких неверных попыток устройство блокируется, и не годится там, где перебор ничем не ограничен.

Откуда взяты скорости подбора

Все цифры в таблицах — из опубликованных измерений, а не оценки «на глаз». Показывать одно универсальное «время взлома» нельзя: разброс между хорошей и плохой защитой достигает шести порядков.

Защита Скорость подбора Откуда цифра
bcrypt, стоимость 10 138 675 в секунду Измерено на 16 картах RTX 5090, арендованных в облаке. Hive Systems Password Table, 2026. Стоимость 10 — наблюдаемое значение по умолчанию в OpenBSD, Auth0, Laravel
Wi-Fi WPA2 2,5 млн в секунду hashcat, режим 22000 (PBKDF2-HMAC-SHA1, 4096 итераций), одна RTX 4090. Публичный бенчмарк
SHA-256 без усиления 27,7 млрд в секунду hashcat, одна RTX 5090, сравнение видеокарт 2026 года
MD5 219,5 млрд в секунду Тот же источник. Устаревшая защита, но всё ещё встречается

Время считаем до попадания в среднем: атакующий находит пароль, перебрав примерно половину вариантов.

Важно, что цифры устаревают. По данным того же исследования, скорость подбора растёт примерно на 20–25% в год: один и тот же восьмисимвольный пароль против bcrypt держался 225 лет в 2024 году, 164 года в 2025 и 132 года в 2026. Мы будем обновлять числа, а не оставлять их «навсегда верными».

Про квантовые компьютеры

Их часто упоминают как повод паниковать. Для паролей это неактуально: известный квантовый алгоритм даёт против хеш-функций только квадратичное ускорение, то есть эффективная стойкость делится на два — это компенсируется одним дополнительным словом. Квантовые компьютеры угрожают обмену ключами и цифровым подписям, а не паролю, защищённому bcrypt.

Что об этом говорят стандарты

Действующая редакция американского стандарта аутентификации NIST SP 800-63B (версия 4, действует с августа 2025 года) прямо поддерживает подход с длинными словесными паролями:

  • Минимум 15 символов для пароля, который используется как единственный фактор. В предыдущей редакции было 8.
  • Сервисы обязаны принимать пароли длиной хотя бы до 64 символов, все печатные символы и пробел.
  • Сервисам запрещено требовать обязательного смешения типов символов — «нужна заглавная, цифра и знак». В предыдущей редакции это было рекомендацией, теперь прямой запрет.
  • Сервисам запрещено требовать периодической смены пароля без признаков компрометации.
  • Пароль надо сверять со списком утечек целиком, а не по отдельным словам внутри. Поэтому словесный пароль из обычных слов такую проверку проходит: значение имеет только полная строка.

Требование о минимуме 15 символов — ещё один аргумент за слова. Четыре слова с разделителями дают около 28 символов без усилий, а набрать пятнадцать случайных значков вручную почти невозможно.

Чего мы не делаем

  • Не храним пароли. Хранить нечего — они не покидают браузер. В памяти браузера сохраняются только настройки: выбранный профиль и количество слов.
  • Не используем кириллицу в пароле по умолчанию. Русские буквы негде набрать в BIOS, на телевизорах и в части корпоративных систем, а многие сайты их не принимают.
  • Не добавляем скрытых «улучшений». Если настройка даёт ноль бит, рядом с ней написан ноль.
  • Не подставляем Math.random, если криптография в браузере недоступна. В таком случае генератор честно сообщает, что работать не может.
  • Не ставим счётчики и рекламу на странице генератора. Сторонний скрипт технически способен прочитать пароль из страницы, а значит обещание приватности стало бы неправдой.

Дальше