1

我对 Perl 不是很熟悉,但在过去的两天里,我一直在搜索文档和其他资源,但没有成功。在文档中,它是这样写的:

Perl v5.18 包括对多个哈希函数的支持,并更改了默认值(为ONE_AT_A_TIME_HARD),您可以通过在编译时定义符号来选择不同的算法。有关当前列表,请参阅安装文档。请注意,从 Perl v5.18 开始,我们只能推荐使用默认值或 SIPHASH。所有其他人都知道有安全问题,仅用于研究目的。

问题是在 INSTALL 文档和其他来源/站点等中都没有。我可以找到如何定义这个符号。

我想要做的是将默认ONE_AT_A_TIME_HARD哈希函数更改为,ONE_AT_A_TIME_OLD以便我可以模拟旧的 Perl 5.16 行为。

4

1 回答 1

5

这听起来像是一个 XY 问题。你想通过强制将 perl 中的哈希算法降级为已知问题的算法来完成什么?

来自评论:

我需要运行大量用 perl 5.16 编写的测试用例,其功能取决于旧的哈希实现,并且由于用例数以百计,因此更改代码是完全不可能的。

唷,这是个坏消息。找到那些开发人员,并用副本击中他们的头部perldata

哈希是标量值的无序集合,由其关联的字符串键索引。

具体来说 - 如果这对您来说是一个问题,这意味着您的代码库将哈希视为有序,而它们不是并且从来没有。(只是它们在 5.18 之前相当一致,而在 5.18 之后则更加随机)。

来自perldelta

当遇到这些变化时,清除它们的关键是接受散列是无序的集合并采取相应的行动。

见:http ://blog.booking.com/hardening-perls-hash-function.html

要回答您的问题 - 如果您真的必须:

./Configure -DPERL_HASH_FUNC_ONE_AT_A_TIME_OLD -des && make && make test

但这是一个非常非常糟糕的主意,因为正如INSTALL您的 perl 源包中的文件指出的那样:

请注意,从 Perl 5.18 开始,我们只能推荐使用 default 或 SIPHASH。所有其他人都知道有安全问题,仅用于研究目的。

通过以这种方式构建,您为使用它perl的每个perl程序引入了一个已知的安全漏洞。

注意 -ONE_AT_A_TIME_HARD的默认值,所以这不会改变 perl 5.18 的工作方式。你可能是说PERL_HASH_FUNC_ONE_AT_A_TIME_OLD

于 2015-08-14T09:00:36.167 回答