为什么Perl和Ruby使用/dev/urandom?

16

我使用perl和bash对一个简单的脚本进行了strace

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

为什么Perl需要伪随机数生成器来运行这么简单的脚本?我希望只有在第一次使用随机数据之后才打开/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使用不同的模式打开它?


1
也许是为了播种自己的 PRNG? - Daniel Kamil Kozar
生成随机数并不是一件简单的事情。/dev/random提供了从计算机中获取“随机”数据的方法,因此perl使用它。除此之外,你还能用什么方式获得随机输入呢?你对这种方式有什么问题吗?你需要“更好”的伪随机数吗? - bytepusher
我在我的系统上尝试了同样的操作。它只从“/dev/urandom”读取了4个字节,然后关闭了它。 - Keith Thompson
2
在5.20上测试这个会很有趣 http://www.effectiveperlprogramming.com/2014/06/perl-5-20-uses-its-own-random-number-generator/ - hmatt1
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - hmatt1
显示剩余6条评论
1个回答

18

尝试搜索“算法复杂性攻击拒绝服务”。

简而言之,如果一个Perl脚本接受外部输入(例如从文件、网络等)并将数据存储在哈希表中,则能够影响数据的攻击者可以利用哈希算法来将哈希值(O(1)查找)恶化为链表(O(N)查找)。为了防止这种类型的攻击,哈希算法的某些参数在程序启动时会被随机化,以使攻击者无法构造一系列哈希键值来引发问题。

显然,这不仅适用于Perl。任何使用哈希算法的程序都有可能受到此类攻击的威胁。


5
值得注意的是,之所以在启动时执行此操作而不是您第一次在Perl中使用哈希,是因为哈希在内部被使用,例如在符号表中。 - harmic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接