【问题标题】:Hash randomization in Perl 5Perl 5 中的哈希随机化
【发布时间】:2011-10-04 19:53:25
【问题描述】:

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

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

【问题讨论】:

标签: perl random hash


【解决方案1】:

Algorithmic Complexity Attacks:

在 Perl 5.8.1 中,散列函数受到伪随机种子的随机干扰,这使得生成这种顽皮的散列键变得更加困难。 [...] 但从 5.8.2 开始,它仅在内部检测到病理数据的插入时才用于单个哈希

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

【讨论】:

  • 来自perlrun 以及:Most hashes by default return elements in the same order as in Perl 5.8.0. On a hash by hash basis, if pathological data is detected during a hash key insertion, then that hash will switch to an alternative random hash seed.
  • 阅读 perlrun,在我看来,如果设置了 env var,它应该用于所有非病理性哈希,但这似乎不是行为。
  • @Chas。欧文斯,即使种子生效,它也永远不会可靠随机。使用List::Utilshuffle
  • @Chas。 Owens,不,没有任何版本的 Perl 使键顺序随机化。最好的桶选择可能是随机的。这两件事是不等价的。
  • @Chas。欧文斯,变化无常!= 不可预测。
【解决方案2】:

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

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

在 5.8.1 中是正确的,并且与它之前的段落相矛盾:

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

perlsecAlgorithmic Complexity Attacks 条目正确:

在 Perl 5.8.1 中,随机扰动是默认完成的,但从 5.8.2 如果内部检测到 插入病理数据。

perlsec 继续说

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

[强调添加]

由于设置PERL_HASH_SEED 确实 影响哈希顺序,我称之为错误。在 rt.perl.org 上搜索“PERL_HASH_SEED”未返回任何结果,因此这似乎不是“已知”问题。

【讨论】:

  • 它与前面的段落并不矛盾,因为前面的段落解释了随机化行为
  • PERL_HASH_SEED 并不总是影响哈希顺序这一事实并不是一个错误,因为这不是它所记录的内容。正如引用和强调的那样,它被记录在案会影响随机化,并且确实如此。
  • @ikegami 当然可以更清楚。仅阅读 perlrun 让我认为设置 PERL_HASH_SEED 会导致它随机化,如果检测到病理病例,则不会启用随机化。
  • @ikegami:这两段都声称描述了默认行为。一个说哈希顺序是随机的,另一个说“与 Perl 5.8.0 中的顺序相同”,这是 not 随机的。这怎么不矛盾?
  • @ikegami:虽然我可以看到你是如何解释 perlsec 的描述的(同样的事情发生在我身上),但感觉像是一种合理化。如果仅在检测到需要随机化时使用种子,则应明确说明。此外,在面对算法攻击时,能够(总是)设置种子似乎比设置已知种子更有用。我本可以发誓它在 5.8.1 中以这种方式工作(即设置 PERL_HASH_SEED 以针对程序的不同运行获得相同的顺序)但我没有安装该版本并且 perldoc.perl.org 不会返回这么远。
猜你喜欢
  • 2013-01-06
  • 2017-03-17
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2015-08-15
相关资源
最近更新 更多