Хеш-рандомизация в Perl 5 - PullRequest
8 голосов
/ 14 июля 2011

Когда вышел Perl 5.8.1, он добавил рандомизацию хеша .Когда вышел Perl 5.8.2, я думал, что он убрал рандомизацию хешей, если только не присутствовала переменная окружения (PERL_HASH_SEED).Теперь мне кажется, что я серьезно ошибаюсь:

PERL_HASH_SEED=$SEED perl -MData::Dumper -e 'print Dumper{map{$_,1}"a".."z"}'

Всегда отбрасывает один и тот же порядок клавиш независимо от значения $SEED.

.делать что-то не так, или это ошибка?

Ответы [ 2 ]

6 голосов
/ 14 июля 2011

См. Атаки алгоритмической сложности :

В Perl 5.8.1 хеш-функция случайным образом возмущается псевдослучайным начальным числом, что затрудняет генерацию таких непослушных хеш-ключей. [...] но с 5.8.2 он используется только для отдельных хешей, если внутренние органы обнаруживают вставку патологических данных .

Так что рандомизация не всегда происходит, только когда Perl обнаруживает, что это необходимо.

1 голос
/ 14 июля 2011

Как минимум было несколько небрежных обновлений документации.В третьем абзаце записи perlrun для PERL_HASH_SEED написано:

Поведение по умолчанию - рандомизация, если не установлен PERL_HASH_SEED.

, который был истинным только в 5.8.1 и противоречит непосредственно предшествующему абзацу:

Большинство хэшей по умолчанию возвращают элементы в том же порядке, что и в Perl 5.8+0,0.На основе хэша за хешем, если патологические данные обнаружены во время вставки ключа хеша, то этот хеш переключится на альтернативное случайное начальное число хеша.

запись perlsec для Алгоритмическая Атака Сложности получает это право:

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

perlsec продолжает:

Если кто-то хочет по какой-то причине подражать старому поведению, [...] установите переменную средыPERL_HASH_SEED до нуля, чтобы отключить защиту ( или любое другое целое число, чтобы вызвать известное возмущение , а не случайное).

[выделение добавлено]

Поскольку установка PERL_HASH_SEED не делает , а не влияет на порядок хеширования, я бы назвал это ошибкой.Поиск по запросу «PERL_HASH_SEED» на rt.perl.org не дал никаких результатов, поэтому он не является «известной» проблемой.

...