Страницы

Поиск по вопросам

пятница, 26 апреля 2019 г.

Как работает функция rand на машинном уровне

Во множестве языков есть генератор случайных чисел и я довольно часто использую его у себя на сайте. Но вот меня начал интересовать вопрос, а как работает этот генератор? Не может же он просто ниоткуда выбрать число, значит должна быть привязка к чему-то для выбора. Как эти функции выбирают число? Может кто-то из вас знает ответ на этот вопрос, мне бы было очень интересно узнать.


Ответ

Генератор случайных чисел на то и генератор что он не получает откуда-то настоящие случайные числа каждый раз. Напротив, или вы его инициализируете каким-то в самом деле случайным числом, или он сам делает это автоматически при первом использовании.
Это само по себе здорово потому что можно писать предсказуемые программы, тогда, когда вам это нужно, так как последовательность чисел выдаваемая таким генератором явно определяется исходным числом (seed).
С другой стороны если вы на вход такому генератору дадите недостаточно случайное число (например, текущее время в секундах), которое злоумышленник сможет угадать, то вас ждут неприятности.
Откуда правильно брать "настоящие" случайные числа (настоящие в той мере что никто не может их угадать) - проблема широкая. Лучше не выдумывать, а брать эти числа у ОС через стандартные механизмы получения энтропии. В Linux это /dev/urandom и системный вызов getrandom. В других ОС есть свои специфичные методы получения случайных чисел.
Отдельной проблемой является всевозможный софт, который не использует системные источники энтропии по причинам лени разработчика ли по причинам ошибок. С такой проблемой сталкивались и ssh в Debian, и в PHP с uniqid (хоть даже это отмечено в документации), и прокалывалась фирма Sony, и так далее, и тому подобное
Как вы можете догадаться, системные источники энтропии тоже откуда-то пополняются. В Linux первичными источниками энтропии служат всевозможные случайные события вроде движения мышки пользователем или задержек при обращении к дискам. Кроме того, нет проблемы использовать "железные" источники энтропии, которые или продаются как отдельные устройства, или встроены в TPM, присутствующий во многих современных ноутбуках.

Комментариев нет:

Отправить комментарий