Случайность означает, что следующее полученное вами значение не зависит от предыдущего значения, и вы не можете предсказать его.
Это на самом деле трудно для компьютера, так как компьютер - это просто очень быстрый калькулятор, поэтому он может выполнять математические вычисления, но всегда будет получать точный ответ каждый раз. Вы можете сделать что-то близкое к случайности с математикой под названием "псевдослучайность" - но это не достаточно высокого качества для криптографии.
Таким образом, Linux собирает "случайность" в пулы из различных источников (например, время между входными событиями). "Количество" случайности в этом пуле - энтропия. Меньше энтропии = менее регулярные, повторяющиеся, предсказуемые паттерны - вам нужно как можно больше энтропии. Ядро Linux будет "заполнять" свой пул энтропией, когда оно становится низким, но это зависит от того, что происходит в системе, так как оно использует время между непредсказуемыми аппаратными событиями для его генерации.
Если пул пуст, /dev/random
заблокирует или прекратит выдавать данные, пока ядро не получит достаточную энтропию.
/dev/urandom
будет продолжать работать, используя псевдослучайные методы для генерации случайных чисел.
Теперь, когда вы освоили основы, вы всегда можете использовать urandom, и вот почему.
Вот выдержка из этой статьи, объясняющая, почему это не имеет значения:
Но давайте предположим, что вы получили эти «истинные» случайные числа. Что вы собираетесь с ними делать?
Вы распечатываете их, создаете их и вешаете на стену гостиной, чтобы насладиться красотой квантовой вселенной? Это здорово, и я, конечно, понимаю.
Чего ждать? Ты их используешь? Для криптографических целей? Ну, это все портит, потому что теперь все становится немного уродливым.
Видите ли, ваши по-настоящему случайные, благословленные случайные числа с квантовым эффектом помещены в некоторые менее респектабельные, запятнанные в реальном мире алгоритмы.
Поскольку почти все криптографические алгоритмы, которые мы используем, не поддерживают теоретико-информационную безопасность. Они могут «только» предложить вычислительную безопасность. Два исключения, которые приходят мне в голову, это «Секретный обмен Шамира» и «Одноразовый блокнот». И хотя первый может быть допустимым контрапунктом (если вы действительно намереваетесь его использовать), последний крайне непрактичен.
Но все те алгоритмы, о которых вы знаете, aes, rsa, Diffie-Hellman, эллиптические кривые и все те криптопакеты, которые вы используете, OpenSSL, GnuTLS, Keyczar, криптографический API вашей операционной системы, являются только вычислительно безопасными.
Какая разница? В то время как теоретически защищенные алгоритмы являются безопасными, период, эти другие алгоритмы не могут гарантировать безопасность от противника с неограниченными вычислительными возможностями, который пробует все возможности для ключей. Мы по-прежнему используем их, потому что все компьютеры в мире потребуют больше времени, чем существовала вселенная. Это уровень «небезопасности», о котором мы здесь говорим.
Если только какой-нибудь умник не сломает сам алгоритм, используя гораздо меньше вычислительных ресурсов. Даже вычислительная мощность достижима сегодня. Это большая награда, о которой мечтает каждый криптоаналитик: сломать себя, сломать рису и так далее.
Так что теперь мы находимся в точке, где вы не доверяете внутренним строительным блокам генератора случайных чисел, настаивая на «истинной случайности» вместо «псевдослучайности». Но затем вы используете те «истинные» случайные числа в алгоритмах, которые вы так презираете, что не хотите, чтобы они были рядом с генератором случайных чисел!
Правда в том, что когда нарушены современные хэш-алгоритмы или когда сломаны современные блочные шифры, не имеет значения, что из-за них вы получаете «философски небезопасные» случайные числа. У вас ничего не осталось, чтобы безопасно использовать их в любом случае.
Так что просто используйте эти защищенные в вычислительном отношении случайные числа для ваших вычислительно безопасных алгоритмов. Другими словами: используйте /dev /urandom.