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

Как браузеры генерируют случайные значения

Современные браузеры предоставляют два основных API для генерации случайных значений:

  • Math.random() — быстрый, но не криптографически стойкий
  • crypto.getRandomValues() — криптографически стойкие случайные значения
  • crypto.randomUUID() — генерирует UUID v4 с использованием стойкой случайности

Web Crypto API

Web Crypto API (window.crypto) предоставляет доступ к криптографически стойким генераторам случайных чисел, встроенным в браузер. Эти генераторы используют энтропию операционной системы — аппаратный шум, вариации тайминга и другие непредсказуемые источники.

Когда вы используете crypto.getRandomValues(), вы получаете значения, пригодные для криптографических операций: генерации паролей, токенов и ключей шифрования.

Почему Math.random не подходит для секретов

Math.random() использует генератор псевдослучайных чисел (PRNG). PRNG детерминирован: при одном и том же начальном значении (seed) он выдаёт одну и ту же последовательность. Если злоумышленник сможет угадать или наблюдать seed, он предскажет все «случайные» значения.

Для задач, не связанных с безопасностью (анимации, игры, перемешивание плейлиста), Math.random() подходит. Для всего, что связано с безопасностью — пароли, токены, ключи, секреты — всегда используйте Web Crypto API.

RandKit не отправляет значения на сервер

Вся генерация в RandKit происходит целиком в вашем браузере. Во время генерации не выполняется ни одного сетевого запроса. Вы можете убедиться в этом, открыв вкладку Network в DevTools вашего браузера — при нажатии кнопки «Генерировать» вы не увидите ни одного fetch- или XHR-запроса.

RandKit не сохраняет сгенерированные значения в localStorage, sessionStorage или cookie. Как только вы уходите со страницы, значения исчезают.