Perl 5中的哈希随机化

时间:2011-07-13 20:12:49

标签: perl random hash

当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的值如何,始终都会使用相同的键排序。

哈希随机化完全消失了,我做错了什么,或者这是一个错误?

2 个答案:

答案 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”并未返回任何结果,因此它似乎不是“已知”问题。