Русский

Текстовые и повседневные инструменты · Генератор паролей

Объяснение смещения по модулю: выбор случайного слова из списка без перекоса

· Как это работает

пароли случайность криптография

Ведра с нечетными номерами рядом с четным набором, полученным после отклонения хвоста.
Оригинальная векторная иллюстрация ToolAcre

Показывает, почему «длина списка случайных чисел по модулю» отдает предпочтение одним словам над другими, когда диапазон делится неравномерно, насколько велик перекос и как его устраняет выборка с отбраковкой.

Честный кубик и несправедливый короткий путь: почему взять случайное число по модулю 7,776 — это не то же самое, что бросить игральную кость

Честный источник все еще может питать несправедливую процедуру отбора. Если программа считывает целое число и сразу же извлекает остаток после деления на длину списка, некоторые индексы получают больше исходных значений всякий раз, когда исходный диапазон не делится точно на эту длину. Ошибка заключается в шаге сокращения, а не обязательно в байтах. ToolAcre избегает этого ярлыка перед выбором любого слова EFF.

Физические кубики обеспечивают интуитивное сравнение только тогда, когда полные группы результатов отображаются равномерно. Реализация браузера имеет другой необработанный диапазон, поэтому она вычисляет окно принятия для запрошенной границы. В этой статье обсуждается этот встроенный механизм, а не утверждается, что байты браузера буквально воспроизводят пять игральных костей. Оба могут выбирать индексы, но их процедуры и аудиторские доказательства различны.

Откуда возникает смещение: битовое значение 32 не делится поровну на сегменты 7,776, поэтому первые несколько слов получают один дополнительный шанс.

Для одного байта и границы 100 необработанный диапазон имеет 256 возможных значений. Две полные группы 100 подходят, оставляя значения 56. Уменьшение каждого байта по модулю 100 дает индексам от нуля до 55 по три прообраза каждый, тогда как индексы от 56 до 99 получают только два. Входные байты могут быть однородными, но выбранное распределение сегментов — нет.

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

Насколько велик эффект — мал для большого случайного диапазона, но ненулевой, и почему криптографический код отказывается его принять

Детерминированные тесты делают неровный хвост наблюдаемым. Границы 3, 5, 7, 100 и 7,776 намеренно неудобны, в то время как граница степени двойки демонстрирует случай отсутствия отклонения. Другой статистический контроль использует тот же источник Web Crypto для правильной функции и простой помощник по модулю, поэтому тест изолирует стратегию сокращения, а не обвиняет источник энтропии.

ToolAcre не преобразует эти проверки распространения в прогноз времени взлома. Предвзятость снижает единообразие, но для перевода этого снижения в затраты конкретного злоумышленника требуется полная модель угроз. Инженерные требования более понятны: каждый подходящий индекс должен иметь одинаковое количество принятых необработанных значений, и код может обеспечить именно это.

Проверенные примеры перекоса в комментариях к реализации и детерминированных тестах

`secureRandomInt` находит наименьшее количество целых байтов, способное представлять наибольший действительный индекс. Он вычисляет диапазон байтов, вычитает остаток после деления на границу и вызывает результат `limit`. Значения ниже этого предела относятся к полным группам; значения, равные ему или превышающие его, отбрасываются до того, как будет разрешено выполнение операции по модулю.

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

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

Возможны и другие конструкции с единым целым числом, но они не соответствуют поведению этого пакета и поэтому не представлены как взаимозаменяемые опции ToolAcre. Движок предоставляет один проверенный путь. `secureRandomChoice` проверяет, что его входные данные являются непустым массивом, и делегирует `secureRandomInt(items.length)`, делая выбор слова прямым потребителем ограниченного целочисленного контракта.

Генератор случайных паролей использует один и тот же путь для символов, а затем вызывает перетасовку Фишера-Йейтса, управляемую безопасными ограниченными заменами. Он не использует `sort` со случайным компаратором. Сохранение одного примитива под несколькими функциями делает обзор исходного кода простым: исправьте или протестируйте единообразное сокращение один раз, а затем следуйте за его вызывающими объектами.

Альтернативные конструкции находятся за пределами этого модуля; путь доставки использует выборку отклонения

Регрессионный тест связанного 100 предоставляет каждый хвостовой байт от 200 до 255, а затем последний 42. Правильный код использует все 56 отклоненные байты и ответы от 42. Второй целевой случай поставляет 200 и 7; поскольку 200 по модулю 100 будет равно нулю, возврат 7 доказывает, что первый байт был отклонен, а не незаметно уменьшен.

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

Рабочий пример: связанный 100 отклоняет байт 200 и принимает следующий 7

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

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

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

Генератор парольных фраз не должен отдавать предпочтение раннему вводу только потому, что его необработанный диапазон оставляет остаток. ToolAcre берет байты из Web Crypto, отклоняет неполный хвост и сокращает только значения внутри полных групп одинакового размера. Тесты устанавливают границы как отклонения, так и приемлемости, поэтому утверждение не основано на визуальном осмотре результатов.

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