Найти тему

Генерируем случайчные числа в Linux или знакомство с /dev/random и /dev/urandom

Оглавление

Чуть ранее в одной из заметок на канале познакомились с нулевым устройством или /dev/null, который ведет себя словно черная дыра, поглощая поступающие данные и ничего не отдавая взамен. Но перечень необычных устройств в дистрибутивах Linux на этом не закончился и сегодня хочу познакомить вас с генераторами случайных чисел /dev/random и /dev/urandom.

Проведение конкурса под угрозой, так как из более чем из 1000 подписчиков в конкурсе пока что решили принять участие всего 15 человек. Да, вы не ослышались, менее 10% подписчиков. Поэтому если вы подписаны на канал, но еще не приняли участие в конкурсе, то быстренько переходим по ссылке ниже. Если же вы еще не подписаны, но желаете получать качественные и интересные посты про Linux и вдобавок получить один из трех призов, то нажимаете кнопку «Подписаться» и переходите в пост с описанием розыгрыша.

Что такое /dev/random и /dev/urandom?

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

Разница между двумя устройствами

Если объяснять на простом языке, то каждое из устройств использует разные подходы к генерации случайных чисел.

В случае если при обращении к /dev/random пул энтропии (хранилище данных для генерации чисел) окажется пустым, то чтение на это устройство будет заблокировано и пользователь ничего не получит в ответ. Выходит, что если случайность генерируемого числа не соответствует нужному количеству данных в пуле, то никакой генерации не произойдет. Это делает устройство /dev/random идеальным для генерации безопасных и действительно рандомных последовательностей чисел.

Когда мы обращаемся к устройству /dev/urandom и пул оказывается пустым, то устройство начинает само генерировать данные, используя для этого различные алгоритмы (SHA, MD5 и пр.). Получается, что в случае с /dev/urandom получаемая последовательность будет иметь меньшую степень случайности. Это делает устройство идеальным в случае, когда нужно большое количество последовательностей, при этом степень их случайности отходит на второе место.

Наглядное представление работы двух устройств
Наглядное представление работы двух устройств

Описанная разница сокрыта в названиях устройств: random думаю и так понятно, как переводится, тогда как urandom образовано от сочетания слов «unlimited» и «random», то есть бесконечная случайность.

Если спуститься чуть ниже и начать умничать, то можно сказать, что /dev/random используется для генерации случайных чисел, а /dev/urandom для генерации псевдослучайных чисел. Но если попытаться проникать дальше в дебри теории, то того гляди и шею можно свернуть, потому давайте лучше перейдем к практике. Например, при подготовке этого материала набрел на статью в Хабре, где напрочь разрушается все то, что выше написано, но материал, доступный по оставленной ссылке больше для профессионалов, я же попытался объяснить все для обычных пользователей.

Если вы не подписаны на уведомления канала в Телеграме, то самое время сделать это! Подписавшись, вы будете получать сообщения о выходе новых постов быстрее, чем Дзен покажет эти материалы в ленте.

Предназначение /dev/random и /dev/urandom в системе

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

Использование /dev/random и /dev/urandom обычным пользователем

Когда-то на канале выходила заметка про генератор паролей в терминале Linux. Тогда я рекомендовал использовать подписчикам и читателям утилиту pwgen. К слову сказать, она все также установлена в моем дистрибутиве и часто используется для генерации различных паролей для рабочих нужд.

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

sudo < /dev/urandom tr -dc A-Za-z0-9 | head -c14; echo

Генерируем пароли в терминале при помощи /dev/urandom
Генерируем пароли в терминале при помощи /dev/urandom

Разберем, что делает эта команда:

  • sudo - запуск всего что указано дальше от имени суперпользователя
  • < перенаправление стандартного ввода
  • /dev/urandom - обращение к устройству /dev/urandom
  • tr -dc A-Za-z0-9 - фильтрация вывода от /dev/urandom, согласно которой через фильтр проходят только символы от A до Z, от a до z и числа от 0 до 9.
  • | - перенаправление потока в команду head
  • head -c14 - генерация строки, состоящей из 14 символов
  • echo - вывод сгенерированной строки в консоль

По идее, в одной команде мы объединили материал нескольких ранее выходивших на канале постов. Меняя число символов можно получать пароль различной длины, меняя содержимое фильтрации можно получать пароли, состоящие из любых необходимых символов. Можно ли использовать /dev/random вместо urandom? Бога ради, никто не мешает этого делать, но помните, что при использовании /dev/random есть такая неприятная проблема, как блокировка устройства.

Генерируем пароли в терминале при помощи /dev/random
Генерируем пароли в терминале при помощи /dev/random

Подведем итог

Мы познакомились с еще одними необычными устройствами в дистрибутивах Linux, узнали зачем эти устройства нужны и как их можно использовать при повседневном использовании. Несмотря на то, что обращение к /dev/urandom или /dev/random не является сложной задачей, все равно рекомендую использовать для генерации паролей такие утилиты, как pwgen и менеджер Pass. Материал о последнем неоднократно выходил на канале.