Случайность в браузере
Как браузеры генерируют случайные значения
Современные браузеры предоставляют два основных 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. Как только вы уходите со страницы, значения исчезают.