当Perl 5.8.1问世时,它添加了hash randomization。当Perl 5.8.2出来时,我想,除非存在环境变量(PERL_HASH_SEED
),否则它会删除散列随机化。现在好像我被严重误认为是
PERL_HASH_SEED=$SEED perl -MData::Dumper -e 'print Dumper{map{$_,1}"a".."z"}'
无论$SEED
的值如何,始终都会使用相同的键排序。
哈希随机化完全消失了,我做错了什么,或者这是一个错误?
答案 0 :(得分:6)
请参阅Algorithmic Complexity Attacks:
在Perl 5.8.1中,散列函数被伪随机种子随机扰动,这使得生成这种淘气的散列密钥更加困难。 [...]但是从5.8.2开始,如果内部检测到病理数据的插入,仅用于个别哈希。
因此,只有当perl检测到需要时才会发生随机化。
答案 1 :(得分:1)
至少有一些草率的文档更新。在PERL_HASH_SEED
的{{1}}条目的第三段中,它说:
除非设置
PERL_HASH_SEED
,否则默认行为是随机的。
在5.8.1中仅为 ,与之前的段落相矛盾:
默认情况下,大多数哈希以与Perl 5.8.0中相同的顺序返回元素。在散列哈希的基础上,如果在散列键插入期间检测到病态数据,那么该散列将切换到备选的随机散列种子。
perlrun 算法复杂性攻击的条目是正确的:
在Perl 5.8.1中,默认情况下进行随机扰动,但截至 5.8.2如果内部检测到它,它仅用于单个哈希 插入病理数据。
perlsec继续说
如果出于某种原因想要模仿旧行为[...]设置 环境变量
PERL_HASH_SEED
为零以禁用 保护(或强制已知扰动的任何其他整数,而不是 比随机的。
[强调补充]
由于设置PERL_HASH_SEED
不影响哈希顺序,我称之为错误。在rt.perl.org上搜索“PERL_HASH_SEED”并未返回任何结果,因此它似乎不是“已知”问题。