Perl 5中的散列随机化



当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的值如何,总是反踢相同的键顺序。

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

参见算法复杂度攻击:

在Perl 5.8.1中,哈希函数被伪随机种子随机扰动,这使得生成这种顽皮的哈希键变得更加困难。[…但是从5.8.2开始,如果内部检测到病理数据的插入,它仅用于单个哈希。

所以随机化并不总是发生,只有当perl检测到需要时才会发生。

至少有一些草率的文档更新。在perlrun的PERL_HASH_SEED条目的第三段中,它说:

默认行为是随机化,除非设置了PERL_HASH_SEED

在5.8.1中为真,并且与它前面的段落相矛盾:

默认情况下,大多数散列返回元素的顺序与Perl 5.8.0相同。在逐个哈希的基础上,如果在哈希键插入期间检测到病态数据,则该哈希将切换到另一个随机哈希种子。

perlsec关于算法复杂度攻击的条目是正确的:

在Perl 5.8.1中,随机扰动是默认的,但是在5.8.2只有在内部检测到病理资料插入。

perlsec接着说

如果一个人出于某种原因想模仿旧的行为[…]设置环境变量PERL_HASH_SEED为零以禁用保护(或任何其他整数来强制一个已知的扰动,而不是不是随机的).

[粗体字另加]

由于设置PERL_HASH_SEED不会影响哈希顺序,因此我将其称为bug。查找"perl_hash_seed";On rt.perl.org没有返回任何结果,所以它看起来不是一个"已知"。问题。

最新更新