Мне нужна слабая энтропия. Я знаю, что могу использовать унифицированный буфер, но если мне просто нужно целое число, хватит ли его адреса? - PullRequest
3 голосов
/ 07 декабря 2009

Я работаю в Linux, в которой рандомизация размещения адресного пространства. Нужно ли объявлять буфер в стеке, оставлять его неинициализированным и использовать его для энтропии, или я могу просто взять адрес чего-то, уже находящегося в стеке, привести его к целому числу и (зная, что он несколько случайный из-за для адресации пространства рандомизации) использовать это целое число вместо энтропии?

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

Ответы [ 5 ]

6 голосов
/ 07 декабря 2009

Если вам нужна слабая энтропия в Linux, почему бы не прочитать /dev/urandom? Это неблокирующий вариант /dev/random, который меньше ... случайный (но, опять же, неблокирующий).

3 голосов
/ 07 декабря 2009

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

Как и другие предлагали, использование / dev / random - хорошая идея. Если это недоступно, вы можете избежать вызова функции time () (time.h), если вам нужна небольшая энтропия.

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

2 голосов
/ 07 декабря 2009

Что не так с / dev / random?

Не используйте неинициализированную память для энтропии. Особенно стека. Он имеет тенденцию выглядеть очень похожим в последовательных пробегах. И это вполне предсказуемо и не очень случайно.

1 голос
/ 07 декабря 2009

Почему бы вам не прочитать несколько байтов из /dev/random или /dev/urandom?

1 голос
/ 07 декабря 2009

Что именно вы подразумеваете под слабым? Канонический источник энтропии в C (для некриптографических целей) - time из <time.h>.

Доступ к неинициализированной переменной является неопределенным поведением и может иметь непредсказуемые последствия на некоторых платформах. Не делай этого.

...