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