-1

В linux /dev /random основывается на "переменных среды", а /dev /urandom основан на алгоритме и времени. Мои вопросы:

Откуда /dev /random собирает эти переменные.

И если у вас есть две машины, настроенные на одно и то же время (вплоть до миллисекунды, если это возможно), и имеют одинаковую скорость, ОС и т.д. ... и возьмете шестнадцатеричный дамп /dev /urandom с числом X байтов, они будут иметь такое же точное значение (потому что время было одинаковым)?

3 ответа3

4

Откуда /dev /urandom собирает эти переменные.

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

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

И если у вас есть две машины, настроенные на одно и то же время (вплоть до миллисекунды, если это возможно), и имеют одинаковую скорость, ОС и т. Д ... и возьмете шестнадцатеричный дамп /dev /random с числом X байтов, они такое же точное значение (потому что время было одинаковым)?

Ну, миллисекунда не будет достаточно хороша. Вы должны быть на том же уровне, на котором процессор измеряет время - миллиардные доли секунды. Но, конечно, так и должно быть. В противном случае, если вы увидели состояние одной машины, вы могли бы знать со 100% уверенностью, что другая машина не может иметь то же состояние. А так как состояние должно быть случайным, вы не должны иметь возможность смотреть на любую другую машину и знать что-либо о состоянии со 100% уверенностью. Пока шансы, что это может быть достигнуто, достаточно низки (скажем, меньше, чем один на 2 ^ 100), тогда это прекрасно.

Даже если вы бросите два кубика, каждый с миллиардом сторон, они могут подойти одинаково. Если они делают это только раз в миллиард раз, то так и должно быть.

3

Взгляните на руководство urandom , а именно на описание:

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

Чтение с устройства /dev /urandom не будет блокировать ожидание большей энтропии. В результате, если в пуле энтропии недостаточно энтропии, возвращаемые значения теоретически уязвимы для криптографической атаки на алгоритмы, используемые драйвером. Знание того, как это сделать, недоступно в текущей неклассифицированной литературе, но теоретически возможно, что такая атака может существовать. Если это проблема в вашем приложении, используйте вместо этого /dev /random.

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

2

В linux /dev /urandom основан на "переменных среды", а /dev /random основан на алгоритме и времени.

Оба предположения неверны.

Согласно random(4) - справочная страница Linux ( 1), /dev/random собирает шум окружающей среды от драйверов устройств и других источников в пул энтропии.

Примером такого устройства является мышь. 2 Попробуйте выполнить

head -c 1024 /dev/random | base64

очистить пул энтропии (прервать через пару секунд), а затем

head -c 40 /dev/random | base64

читать 40 байтов из /dev/random . Ничего не делайте и наблюдайте, как head останавливается во время регистрации, поскольку в пуле нет новой энтропии.

Прервать, затем выполнить

head -c 40 /dev/random | base64

снова. На этот раз быстро наведите курсор мыши слева направо. head быстро выполнит свою задачу.

Опять же, в соответствии со страницей руководства random(4) - Linux, /dev/urandom использует тот же пул энтропии, но не блокирует. Если пул энтропии недостаточно велик, он возвращается к генератору псевдослучайных чисел (PRNG), чтобы создать больше (псевдо) случайных выходных данных.


1 Фактическое поведение может варьироваться от дистрибутива к дистрибутиву.

2 Пример относится к Ubuntu 12.04. Другие дистрибутивы могут отличаться.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .