Инструмент паролей Назад к генератору

Руководство по безопасности

Генерация паролей на стороне клиента с использованием Web Crypto и rejection sampling

Технический документ, объясняющий модель генерации паролей PwdGen на стороне браузера, границы энтропии, rejection sampling и ограничения приватности.

Аннотация

PwdGen использует метод генерации на стороне клиента: браузер или среда выполнения предоставляет случайные байты через Web Crypto, rejection sampling преобразует эти байты в несмещённые ограниченные индексы, а перемешивание Фишера-Йетса распределяет требуемые классы символов по итоговому паролю. Метод намеренно компактен, проверяем и воспроизводим в веб-приложении, адаптере API, CLI и подготовленном пакете pwdgen-core.

Этот документ описывает инженерную модель. Он не является заявлением о новом криптографическом примитиве, формальном стандарте или независимом стороннем аудите.

Источник случайности

Генератор запрашивает криптостойкие случайные значения через crypto.getRandomValues(). Реализации Web Crypto должны использовать криптографически стойкий генератор псевдослучайных чисел, инициализированный высококачественной энтропией от хост-среды. На практике браузеры делегируют эту задачу операционной системе и платформенным криптопровайдерам.

PwdGen не утверждает, что каждый вызов генерации пароля напрямую использует аппаратный источник шума. Более точное утверждение: браузер предоставляет выход CSPRNG через Web Crypto API, а PwdGen избегает некриптографических псевдослучайных интерфейсов.

Почему не Math.random()

Math.random() не предназначен для использования в чувствительных к безопасности контекстах. Он подходит для симуляций, визуальных эффектов и обычного рандомизированного поведения UI, но не обеспечивает гарантий, ожидаемых для паролей, кодов сброса, ключей подписи или других учётных данных.

PwdGen рассматривает небезопасные псевдослучайные запасные варианты как состояние сбоя. Если Web Crypto недоступен, генератор должен показывать ошибку совместимости, а не молча создавать слабые учётные данные.

Rejection sampling

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

PwdGen использует rejection sampling:

  1. Получить 32-битное беззнаковое целое.
  2. Вычислить наибольшее кратное размера алфавита, которое помещается в 32-битный диапазон.
  3. Отбросить значения выше этой границы.
  4. Применить модуль только к оставшемуся полному диапазону.

Это сохраняет равномерность выбора символов без измеримого смещения модуля.

Покрытие символов и энтропия

Для заданных политик паролей генератор сначала выбирает по одному символу из каждого включённого класса, заполняет остаток из объединённого алфавита, а затем перемешивает результат. Это помогает удовлетворять требованиям целевого сервиса, не помещая предсказуемый класс на предсказуемую позицию.

Теоретическая оценка энтропии:

bits = length × log2(uniqueAlphabetSize)

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

Граница приватности

В браузерных инструментах сгенерированные значения остаются в памяти страницы и видимых полях результатов, пока пользователь не скопирует или не экспортирует их. Локальные генераторы не отправляют сгенерированные пароли на серверы PwdGen, не помещают их в URL и не записывают в события аналитики.

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

Воспроизводимая реализация

Публичный пакет pwdgen-cli и подготовленный пакет pwdgen-core существуют, чтобы модель генерации была проверяема вне веб-страницы. Модульные тесты покрывают включение классов символов, исключённые символы, недопустимые конфигурации, формулы энтропии и отсутствие небезопасных путей псевдослучайного кода.

Цель не в том, чтобы сделать PwdGen частным стандартом. Цель — сделать реализацию достаточно компактной, чтобы разработчики могли читать, тестировать и заменять её, когда их среда требует иной границы доверия.

Источники