Различия между случайным и случайным
Я пытаюсь выяснить разницу между /dev/random
а также /dev/urandom
файлы
- Каковы различия между
/dev/random
а также/dev/urandom
? - Когда я должен их использовать?
- когда я не должен их использовать?
4 ответа
С помощью /dev/random
может потребовать ожидания результата, так как он использует так называемый пул энтропии, где случайные данные могут быть недоступны в данный момент.
/dev/urandom
возвращает столько байтов, сколько запрошено пользователем, и, таким образом, оно менее случайно /dev/random
,
Как можно прочитать из справочной страницы:
случайный
Когда читаешь,
/dev/random
устройство будет возвращать только случайные байты в пределах предполагаемого количества битов шума в пуле энтропии./dev/random
должен подходить для случаев, когда требуется случайность очень высокого качества, например, для однократной подкладки или генерации клавиш. Когда пул энтропии пуст, читает из/dev/random
будет блокироваться, пока не будет собран дополнительный шум окружающей среды.
urandom
Чтение из
/dev/urandom
устройство не будет блокировать ожидание большей энтропии. В результате, если в пуле энтропии недостаточно энтропии, возвращаемые значения теоретически уязвимы для криптографической атаки на алгоритмы, используемые драйвером. Знание того, как это сделать, недоступно в текущей неклассифицированной литературе, но теоретически возможно, что такая атака может существовать. Если это проблема в вашем приложении, используйте/dev/random
вместо.
Для криптографических целей вы должны действительно использовать /dev/random
из-за характера данных он возвращает. Возможное ожидание следует рассматривать как приемлемый компромисс в целях безопасности, ИМО.
Когда вам нужны случайные данные быстро, вы должны использовать /dev/urandom
конечно.
Источник: страница Википедии, страница руководства
Всегда используйте / dev / urandom.
/ dev / urandom и / dev / random используют один и тот же генератор случайных чисел. Они оба посеяны одним и тем же пулом энтропии. Они оба дадут одинаково случайное число произвольного размера. Они оба могут дать бесконечное количество случайных чисел только с 256-битным начальным числом. Пока начальное начальное число имеет 256 битов энтропии, вы можете иметь бесконечный запас произвольно длинных случайных чисел. Вы ничего не получите от использования / dev / random. Тот факт, что есть два устройства, является недостатком в Linux API.
Если вас беспокоит энтропия, использование / dev / random не исправит это. Но это замедлит работу вашего приложения и не будет генерировать числа более случайные, чем / dev / urandom. И если вас не волнует энтропия, почему вы вообще используете / dev / random?
Вот гораздо лучшее / полное объяснение того, почему вы всегда должны использовать / dev / urandom: http://www.2uo.de/myths-about-urandom/
Каковы различия между
/dev/random
а также/dev/urandom
?
/dev/random
а также /dev/urandom
являются интерфейсами к генератору случайных чисел ядра:
- Чтение возвращает поток случайных байтов, достаточно сильный для использования в криптографии
- Запись в них предоставит данные ядра для обновления пула энтропии
Когда дело доходит до различий, это зависит от операционной системы:
- В Linux чтение из
/dev/random
может блокировать, что значительно ограничивает его использование на практике - На FreeBSD их нет.
/dev/urandom
это просто символическая ссылка на/dev/random
,
Когда я должен их использовать? Когда я не должен их использовать?
Это очень трудно найти вариант использования, где вы должны использовать /dev/random
над /dev/urandom
,
Опасность блокировки:
- Это реальная проблема, с которой вам придется столкнуться, когда вы решите использовать
/dev/random
, Для однократного использования, какssh-keygen
должно быть нормально подождать несколько секунд, но для большинства других ситуаций это не вариант. - Если вы используете
/dev/random
Вы должны открыть его в неблокирующем режиме и предоставить своего рода уведомление пользователя, если желаемая энтропия не доступна сразу.
Безопасность:
- В FreeBSD разницы нет, но и в Linux
/dev/urandom
считается безопасным практически во всех практических случаях (например, является ли ранд из /dev/urandom безопасным для ключа входа в систему? и мифы о /dev/urandom). - Ситуации, в которых это может иметь значение, являются крайними случаями, как новая установка Linux. Цитировать из справочной страницы Linux:
/dev/random
интерфейс считается устаревшим интерфейсом, и/dev/urandom
является предпочтительным и достаточным во всех случаях использования, за исключением приложений, которые требуют случайности во время ранней загрузки; для этих приложений вместо этого следует использовать getrandom(2), поскольку он будет блокироваться до тех пор, пока не будет инициализирован пул энтропии.Если исходный файл сохраняется при перезагрузке, как рекомендовано ниже (все основные дистрибутивы Linux делают это, по крайней мере, с 2000 года), выходные данные будут криптографически защищены от злоумышленников без локального корневого доступа, как только они будут перезагружены в последовательности загрузки, и совершенно адекватны для сетевых ключей сеанса шифрования. Так как читает из
/dev/random
Если пользователь может заблокировать его, пользователи, как правило, захотят открыть его в неблокирующем режиме (или выполнить чтение с тайм-аутом) и предоставить своего рода уведомление пользователя, если требуемая энтропия не доступна сразу.
Рекомендация
Как общее правило, /dev/urandom
следует использовать для всего, кроме долгоживущих ключей GPG/SSL/SSH.
Короткий ответ
использование /dev/urandom
Длинный ответ
Они оба питаются одним и тем же криптографически безопасным генератором псевдослучайных чисел (CSPRNG). Дело в том, что /dev/random
ожидание энтропии (или, более конкретно, ожидание оценки системой ее энтропии для достижения соответствующего уровня) имеет значение только при использовании теоретически защищенного алгоритма, в отличие от алгоритма с вычислительной безопасностью. Первый включает в себя алгоритмы, которые вы, вероятно, не используете, такие как Секретный обмен Шамира и Одноразовый блокнот. Последний содержит алгоритмы, которые вы фактически используете и заботитесь о них, такие как AES, RSA, Diffie-Hellman, OpenSSL, GnuTLS и т. Д.
Так что не имеет значения, если вы используете цифры из /dev/random
так как они все равно выкачиваются из CSPRNG, и "теоретически возможно" нарушить алгоритмы, которые вы, вероятно, используете в любом случае.
Наконец, этот "теоретически возможный" бит означает именно это. В этом случае это означает использование всей вычислительной мощности в мире в течение периода времени, в течение которого эта вселенная существовала для взлома приложения.
Следовательно, нет смысла использовать /dev/random
Так что используйте/dev/urandom