python - 为什么perl,ruby使用/dev/urandom

标签 python ruby linux bash perl

我使用 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 需要 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打开方式不同?

最佳答案

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

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

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

关于python - 为什么perl,ruby使用/dev/urandom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26983419/

相关文章:

ruby - 为什么有时需要安装minitest gem?

ruby - net::scp 复制/覆盖文件夹

linux - 仅当 bash 中存在时,如何从文件中删除 header ?

python - 计算样本的标准偏差

python - 为什么在导入时会创建 .pyc 文件?

Python Selenium : How do I click a link in a drop down menu with css selector?

python - 为什么 TravisCI 找不到我的许可证文件?

python - 为什么在 Python 中打印 unicode 字符串列表时得到 u"xyz"格式?

ruby-on-rails - 在 Rails API 中针对测试环境运行 Pact

c - MMAP 中的 ENODEV 错误