Як працює функція rand на машинному рівні - stack overflow російською

Генератор випадкових чисел на те і генератор що він не отримує звідкись справжні випадкові числа кожного разу. Навпаки, або ви його ініціалізіруете якимось справді випадковим числом, або він сам робить це автоматично при першому використанні.

Це само по собі здорово бо можна писати передбачувані програми, тоді, коли вам це потрібно, так як послідовність чисел видається таким генератором явно визначається вихідним числом (seed).

З іншого боку якщо ви на вхід такого генератора дасте недостатньо випадкове число (наприклад, поточний час в секундах), яке зловмисник зможе вгадати, то вас чекають неприємності.

Звідки правильно брати "справжні" випадкові числа (справжні в тій мірі що ніхто не може їх вгадати) - проблема широка. Краще не вигадувати, а брати ці числа у ОС через стандартні механізми отримання ентропії. У Linux це / dev / urandom і системний виклик getrandom. В інших ОС є свої специфічні методи отримання випадкових чисел.

Окремою проблемою є всілякий софт, який не використовує системні джерела ентропії з причин ліні розробника чи з причин помилок. З такою проблемою стикалися і ssh в Debian. і в PHP з uniqid (хоч навіть це зазначено в документації), і проколюють фірма Sony. і так далі і тому подібне .

Як ви можете здогадатися, системні джерела ентропії теж звідкись поповнюються. У Linux первинними джерелами ентропії служать всілякі випадкові події на кшталт руху мишки користувачем або затримок при зверненні до дисків. Крім того, немає проблеми використовувати "залізні" джерела ентропії, які або продаються як окремі пристрої. або вбудовані в TPM. присутній у багатьох сучасних ноутбуках.