Случайность в браузере

Основы

Чем crypto.getRandomValues отличается от Math.random, почему второй нельзя использовать для паролей и как это проверить самому.

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

Два разных генератора

В браузере их два, и путать их нельзя.

Math.random()crypto.getRandomValues
НазначениеИгры, анимация, перемешивание спискаСекреты: пароли, ключи, токены
ИсточникВнутренний алгоритм браузераГенератор операционной системы
ПредсказуемостьПо нескольким значениям вычисляется остальноеНе восстанавливается по выданным значениям
Годится для пароляНетДа
Разница не в качестве «на глаз»: обе последовательности выглядят одинаково случайно. Отличается устойчивость к восстановлению.

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

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

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

Почему нельзя просто взять остаток от деления

Допустим, нужен символ из алфавита в 62 знака, а генератор выдаёт байт от 0 до 255. Кажется логичным взять остаток от деления на 62 — но 256 не делится на 62 нацело.

В остатке получается, что значения 0…7 выпадают четыре раза (0, 62, 124, 186, 248 — пять раз для первых восьми), а остальные — три. Первые символы алфавита начинают выпадать чаще, и энтропия оказывается ниже расчётной.

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

Как проверить самому

  1. Посмотреть исходный код страницы

    Скрипты не сжаты до неузнаваемости: в файле генератора видно, что вызывается именно системный источник.

  2. Открыть вкладку «Сеть» в инструментах разработчика

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

  3. Отключить интернет и попробовать снова

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

Скопировано