【问题标题】:why do perl, ruby use /dev/urandom为什么 perl, ruby​​ 使用 /dev/urandom
【发布时间】:2015-01-14 23:57:25
【问题描述】:

strace'd 使用 perl 和 bash 编写了一个简单的脚本。

$ strace perl -e 'echo "test";' 2>&1 | grep 'random'
open("/dev/urandom", O_RDONLY)          = 3
$ strace bash 'echo "test"' 2>&1 | grep 'random'
$

为什么 perl 需要 pseudorandom number generator 来编写这样一个微不足道的脚本?我希望仅在第一次使用随机数据后打开 /dev/urandom

编辑:我还测试了 python 和 ruby​​

$ strace python -c 'print "test"' 2>&1 | grep random
$
$ strace ruby -e 'print "test\n"' 2>&1 | grep random
open("/dev/urandom", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_CLOEXEC) = 3

为什么perl和ruby打开方式不同?

【问题讨论】:

  • 也许是为了播种自己的 PRNG?
  • 生成随机数并不是一件简单的事情。 /dev/random 允许访问机器中的“随机”数据,因此 perl 使用它。否则你将如何获得随机输入?你对它的完成方式有什么问题?你需要“更好”的伪随机数吗?
  • 我在我的系统上尝试了同样的方法。它仅从/dev/urandom 读取 4 个字节,然后将其关闭。
  • 在 5.20 effectiveperlprogramming.com/2014/06/… 进行测试会很有趣
  • 这可能是相关的? github.com/Perl/perl5/blob/…

标签: python ruby linux bash perl


【解决方案1】:

尝试搜索“Denial of Service via Algorithmic Complexity Attacks”。

简而言之,如果 Perl 脚本接受外部输入(来自文件、网络等)并将该数据存储在散列中,则可以影响数据的攻击者可以利用散列算法破坏散列(O(1)查找)到链表(O(N)查找)。为了防御这种类型的攻击,哈希算法的某些参数在程序启动时是随机的,这样攻击者就无法构造会导致问题的哈希键序列。

这显然不是 Perl 特有的。任何使用散列算法的程序都可能容易受到此类攻击。

【讨论】:

  • 另外值得注意的是,这是在启动时完成的,而不是第一次在 perl 中使用散列的原因是散列在内部使用 - 例如在符号表中。
猜你喜欢
  • 2021-05-19
  • 2016-09-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多