Криптографический CSPRNG
crypto.getRandomValues() — тот же источник, что защищает TLS-соединения и генерацию ключей. Он гарантирует непредсказуемость: зная все остальные слои, результат всё равно нельзя вычислить.
непредсказуемостьГенераторы
Генератор случайных чиселЛюбое число в любом диапазоне Подброс монеткиОрёл или решка — онлайн Бросок кубиковd4–d20 по правилам D&D Лотерейные числа6 из 45, 5 из 36, KenoВыбор
Случайный выбор из спискаПобедитель из списка имён Колесо фортуныКрутить и выбирать Случайные командыРазбить на равные команды Магический шарВопрос — и загадочный ответРозыгрыши
Розыгрыш призовПроверяемый розыгрыш Проверка розыгрышаПодтвердить честностьРозыгрыш без подвоха
Публикуйте хеш до старта — после розыгрыша любой участник пересчитает результат.
Как это работаетТехнология
Большинство сайтов пишут Math.random() и называют это случайностью. Мы смешиваем три независимых источника энтропии через SHA-256 и показываем, как это проверить.
Если внешний маяк недоступен, сайт не ломается: остаются два независимых источника — криптографический генератор и энтропия ваших действий.
Три слоя
Каждый слой закрывает слабость другого. Вместе они дают то, что не может дать ни один генератор по отдельности: непредсказуемость, физическую природу и проверяемость.
crypto.getRandomValues() — тот же источник, что защищает TLS-соединения и генерацию ключей. Он гарантирует непредсказуемость: зная все остальные слои, результат всё равно нельзя вычислить.
непредсказуемостьКаждое движение мыши, тап и нажатие клавиши — это координаты с микронной точностью и тайминги с наносекундным разбросом. Мы хешируем их в пул из 256 бит, который обновляется на каждом событии. Данные не покидают браузер.
физическая природаdrand — распределённая сеть из независимых организаций (Cloudflare, EPFL, Protocol Labs и др.), которая каждые несколько секунд публикует подписанный блок случайных данных. Любой может проверить подпись и убедиться, что значение не подменили.
проверяемостьПроверить можно на сервере маяка: https://api.drand.sh/public/6588449. Подпись BLS выдаётся распределённым комитетом — в одиночку её не подделать.
Запрашиваем публичный маяк случайности…
Проверка
Сгенерируем большую выборку тем же генератором, что используют инструменты, и проверим её статистическими критериями: равномерность байтов (хи-квадрат), баланс битов, серийная корреляция.
Хи-квадрат проверяет, насколько равномерно распределены байты сгенерированных чисел. Для 255 степеней свободы нормой считается значение около 255; p-value больше 0,05 означает, что отклонений от случайности статистически не обнаружено.
Что именно меняется, если не ограничиваться Math.random().
| Свойство | Math.random() | Наш генератор |
|---|---|---|
| Источник | Псевдослучайный, инициализируется один раз | CSPRNG + физическая энтропия + публичный маяк |
| Предсказуемость | Восстановим по нескольким значениям | Не восстанавливается |
| Проверяемость | Нет | Подписанные раунды drand |
| Источник в офлайне | Есть | Остаётся CSPRNG + движения |
| Контроль качества | Нет | Открытый статистический тест |