Найти в Дзене
Блог программиста

Ваш компьютер — худший в мире генератор рандома

Слушай, а ты когда-нибудь задумывался, как работает обычная кнопка «сгенерировать пароль» или функция random() в коде? Мы привыкли верить, что компьютер — это такая всемогущая машина, которая может выдать любое число из головы. На самом деле, это одна из самых больших иллюзий в IT. Тут такое дело: сама природа процессора противоречит понятию случайности. Процессор — это строгий исполнитель алгоритмов. Если ты дашь ему одну и ту же формулу и одни и те же входные данные, он всегда выдаст один и тот же результат. Никакой импровизации, только сухая математика. То, что мы видим в языках программирования — это не случайные числа, а псевдослучайные. Под капотом там крутятся сложные формулы, которые берут какое-то одно стартовое число (его называют «seed» или зерно) и превращают его в длинную последовательность символов. Проблема в том, что если злоумышленник узнает это стартовое число, он сможет предсказать всю цепочку «рандомных» паролей или ключей. Это как знать первый кадр фильма — всё ост
Оглавление

Слушай, а ты когда-нибудь задумывался, как работает обычная кнопка «сгенерировать пароль» или функция random() в коде? Мы привыкли верить, что компьютер — это такая всемогущая машина, которая может выдать любое число из головы. На самом деле, это одна из самых больших иллюзий в IT.

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

Математика

То, что мы видим в языках программирования — это не случайные числа, а псевдослучайные. Под капотом там крутятся сложные формулы, которые берут какое-то одно стартовое число (его называют «seed» или зерно) и превращают его в длинную последовательность символов.

Проблема в том, что если злоумышленник узнает это стартовое число, он сможет предсказать всю цепочку «рандомных» паролей или ключей. Это как знать первый кадр фильма — всё остальное уже записано на пленку и не изменится.

Почему время — это плохой «сид» для безопасности

Раньше разработчики не особо парились и подставляли в формулу текущее время. Казалось бы, логично: секунды и миллисекунды всегда разные. Но для серьезного взлома это просто подарок.

Если хакер знает дату и время создания твоего аккаунта, ему достаточно просто перебрать миллисекунды в этом диапазоне и прогнать их через ту же формулу. В итоге он получит твой «уникальный» пароль быстрее, чем ты успеешь допить кофе. Время — штука предсказуемая, а нам нужно что-то совсем дикое.

Лавовые лампы и квантовые зеркала: охота за настоящим рандомом

Чтобы получить по-настоящему случайное число, программистам приходится выходить за пределы системного блока. В ход идет всё: шум микрофона, температура процессора или хаотичные движения твоей мышки по коврику.

Есть и совсем экзотические примеры. Ребята из Cloudflare, например, поставили в офисе стену из ста лавовых ламп и направили на них камеру. Движение воска в лампах абсолютно непредсказуемо, и картинка с этой камеры превращается в идеальный поток случайных данных. А кто-то вообще использует квантовые свойства света, пропуская фотоны через зеркала.

Короткий вывод для тех, кто кодит

Если ты пишешь простенькую игру или сортируешь список товаров, обычного random() хватит за глаза. Но как только дело касается безопасности, криптографии или паролей — никогда не надейся на стандартные функции «из коробки». Компьютер сам по себе генерировать рандом не умеет, хоть ты тресни.

А вы когда-нибудь сталкивались с тем, что «случайные» события в программах или играх подозрительно часто повторялись? Или верите, что настоящий хаос в коде всё-таки возможен?