Provided by: manpages-ru_4.18.1-1_all bug

ИМЯ

       random - обзор интерфейсов получения случайных чисел

ОПИСАНИЕ

       Генератор  случайных  чисел ядра полагается на энтропию, собранную с драйверов устройств и
       других источников окружающего  шума,  чтобы  задать  начальное  значение  криптографически
       безопасный  генератор  псевдослучайных  чисел  (CSPRNG). При разработке главным параметром
       была безопасность, а не скорость.

       Следующие интерфейсы предоставляют доступ к данным ядерного CSPRNG:

       •  Устройства /dev/urandom и /dev/random, описаны в random(4). Данные устройства  доступны
          с первых версий Linux, а также они есть и во многих других системах.

       •  Системный  вызов,  который есть только в Linux — getrandom(2), доступен начиная с Linux
          3.17. Данный вызов предоставляет доступ к источнику как у /dev/urandom (в этой странице
          упоминается  как источник urandom) так и к источнику как у /dev/random (в этой странице
          упоминается как random). По умолчанию используется источник  urandom;  источник  random
          выбирается  при  указании  системному  вызову  флага GRND_RANDOM (функция getentropy(3)
          предоставляет схожий, более переносимый интерфейс, основанный на getrandom(2)).

   Инициализация пула энтропии
       Ядро  собирает  биты  энтропии  из  окружения.  Когда   собрано   достаточное   количество
       произвольных бит, пул энтропии считается инициализированным.

   Выбор источника случайных чисел
       Если  вы  не  генерируете  долгосрочные  ключи  (и,  скорее  всего,  и в этом случае), то,
       вероятно, не должны читать из устройства /dev/random или запускать getrandom(2)  с  флагом
       GRND_RANDOM.  Вместо  этого  читайте устройство /dev/urandom и запускайте getrandom(2) без
       флага GRND_RANDOM. Алгоритмы шифрования,  используемые  для  источника  urandom,  довольно
       консервативны, и поэтому их должно быть достаточно для любых нужд.

       Недостаток GRND_RANDOM и чтения из /dev/random в том, что эта операция может заблокировать
       выполнение на неопределённый период времени. Более того, работа  с  частично  выполненными
       запросами,  которые  могут вернуться при использовании GRND_RANDOM или чтении /dev/random,
       увеличивает сложность кода.

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

   Сравнение getrandom, /dev/urandom и /dev/random
       В следующую таблицу сведено поведение различных  интерфейсов  получения  случайных  чисел.
       Флаг GRND_NONBLOCK можно использовать для управления поведением блокирования getrandom(2).
       В последней колонке таблицы показано, что может произойти на ранней  стадии  загрузки  ОС,
       когда пул энтропии ещё не инициализирован.

       ┌──────────────┬──────────────┬────────────────┬───────────────────────┐
       │ИнтерфейсПулВозникновениеПоведение, когда      │
       │              │              │ блокировкипул ещё не готов      │
       ├──────────────┼──────────────┼────────────────┼───────────────────────┤
       │/dev/random   │ Блокирующий  │ Если энтропии  │ Блокирует, пока не    │
       │              │ пул          │ недостаточно,  │ наберётся нужно       │
       │              │              │ то блокирует   │ количество            │
       │              │              │ до тех пор,    │ энтропии              │
       │              │              │ пока не        │                       │
       │              │              │ наберётся      │                       │
       │              │              │ нужно          │                       │
       │              │              │ количество     │                       │
       │              │              │ энтропии       │                       │
       ├──────────────┼──────────────┼────────────────┼───────────────────────┤
       │/dev/urandom  │ Данные       │ Никогда не     │ Возвращает данные     │
       │              │ CSPRNG       │ блокируется    │ из                    │
       │              │              │                │ неинициализированного │
       │              │              │                │ CSPRNG (может быть    │
       │              │              │                │ низкая энтропия и     │
       │              │              │                │ не подходить для      │
       │              │              │                │ шифрования)           │
       ├──────────────┼──────────────┼────────────────┼───────────────────────┤
       │getrandom()   │ Тоже, что и  │ Не блокирует в │ Блокирует до          │
       │              │ /dev/urandom │ ожидании пула  │ готовности пула       │
       ├──────────────┼──────────────┼────────────────┼───────────────────────┤
       │getrandom()   │ Тоже, что и  │ Если энтропии  │ Блокирует до          │
       │GRND_RANDOM/dev/random  │ недостаточно,  │ готовности пула       │
       │              │              │ то блокирует   │                       │
       │              │              │ до тех пор,    │                       │
       │              │              │ пока не        │                       │
       │              │              │ наберётся      │                       │
       │              │              │ нужно          │                       │
       │              │              │ количество     │                       │
       │              │              │ энтропии       │                       │
       ├──────────────┼──────────────┼────────────────┼───────────────────────┤
       │getrandom()   │ Тоже, что и  │ Не блокирует в │ EAGAIN                │
       │GRND_NONBLOCK/dev/urandom │ ожидании пула  │                       │
       ├──────────────┼──────────────┼────────────────┼───────────────────────┤
       │getrandom()   │ Тоже, что и  │ EAGAIN, если   │ EAGAIN                │
       │GRND_RANDOM + │ /dev/random  │ недостаточно   │                       │
       │GRND_NONBLOCK │              │ энтропии       │                       │
       └──────────────┴──────────────┴────────────────┴───────────────────────┘
   Генерация ключей шифрования
       The  amount of seed material required to generate a cryptographic key equals the effective
       key size of the key.  For example, a 3072-bit RSA or Diffie-Hellman  private  key  has  an
       effective  key  size  of  128  bits (it requires about 2^128 operations to break) so a key
       generator needs only 128 bits (16 bytes) of seed material from /dev/random.

       Так как разумно добавить некоторый запас прочности к выше указанному минимуму  как  защиту
       против  недостатков  в  алгоритме  CSPRNG,  никакой  доступный  криптографический примитив
       сегодня не может обещать больше чем 256 бит безопасности, поэтому если какая-то  программа
       читает  больше  чем  256  бит  (32  байта)  из  пула случайных чисел ядра за вызов, или за
       разумный интервал повторного  посева  (не  менее  одной  минуты),  то  это  нужно  считать
       признаком того, что шифрование в ней реализовано НЕДОСТАТОЧНО продуманно.

СМ. ТАКЖЕ

       getrandom(2), getauxval(3), getentropy(3), random(4), urandom(4), signal(7)

ПЕРЕВОД

       Русский  перевод  этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Azamat
       Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Katrin Kutepova
       <blackkatelv@gmail.com>,  Lockal <lockalsash@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>,
       Баринов Владимир и Иван Павлов <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.