首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >伪随机发生器没有从(熵池)初始化?

伪随机发生器没有从(熵池)初始化?
EN

Security用户
提问于 2012-04-29 05:46:23
回答 3查看 3K关注 0票数 6

RHEL5手册指出,/dev/urandom将使用熵池,直到它耗尽为止,然后它将求助于一个后退的伪随机算法,这样它就不会阻塞。

但在调查系统时,我发现伪随机生成器(/dev/urandom)是由/var/lib/random-seed初始化的,如/etc/rc.sysinit启动脚本中所述。

但是/var/lib/random-seed本身从/dev/urandom o.O!如/etc/init.d/halt文件脚本中所述,当输入运行级0(关机)或运行级别6(重新启动)时。

所以/dev/urandom从不使用熵池?!

我很困惑..。如有任何帮助,请:)

EN

回答 3

Security用户

发布于 2012-04-29 06:58:47

/dev/urandom总是尝试返回它所能返回的最随机值。在最坏的情况下,它将使用密码技术“拉伸”池中的最后一点熵,以满足您的请求。相反,/dev/随机将阻塞,直到熵池满到足以填充所请求的字节为止,因此/dev/随机将保证一个更随机的值。但是,/dev/随机将阻塞,直到熵存储足够大,以填充请求的字节,这在几乎所有的使用中都是不可接受的。如果熵池是满的,那么/dev/urandom和/dev/随机是相同的。

当rc.sysinit关闭时/dev/urandom复制512个字节。在这一点上,机器可能已经开了一段时间,所以熵池有机会填充。对于这个文件来说,很可能是熵池中的一个纯块。但是,如果熵池不是满的,最好是拥有一些东西,而不是什么都没有(或者更糟糕的是,在关闭之前阻塞熵池,直到熵池足够满为止)。

在Linux系统中,在引导期间填充熵池是非常重要的。为了满足这一需求,关闭操作是将熵池保存到磁盘,启动是在启动过程的早期重新加载这个熵池。在Linux系统上,使用这个熵池计算ASLR的内存位置和TCP序列值。如果池被刷新,那么在每次引导时,守护进程的内存空间布局都不会很随机,并且可以通过缓冲区溢出更容易地利用像SMTP守护进程这样的进程。这也会影响您对MITM攻击的敏感性。这是因为攻击者更容易预测完成TCP 3路握手所需的TCP序列值。

如果您曾经看到没有恢复的Linux发行版在引导时不是熵池,那么需要报告它的漏洞。

如果您想了解更多信息,请尝试阅读random.c中的代码注释

票数 6
EN

Security用户

发布于 2012-04-30 11:07:54

让我补充其他的答案,在一定程度上解释一个带有熵池的PRNG是如何工作的。这有点过于简化了,因为当前的Linux实现使用多个池。但它应该有助于给你基本的想法,该计划如何运作。

首先,它包含三个关键部分:

  1. 熵池。这基本上只是一个字节数组。系统的一个关键目标是确保攻击者不知道这些字节。
  2. A PRNG。这是一个算法组件,在熵池上操作以产生随机输出。
  3. 熵探针的集合。这些“我”的随机性来自网络和磁盘活动,并将它们添加到熵池中。

PRNG“抽出”熵池。确切的算法是复杂的,但基本思想是,它在池上执行加密安全的哈希操作,输出一些哈希,并将一些哈希混合到池中。(在当前的Linux代码中,它实际上使用了两个SHA1操作。)

探测器“填满”熵池。确切的算法甚至更复杂(扭曲的GFSR),但基本思想是,池是混合的,然后从探针的各种信息是XORed进入池。

此外,该系统保持一个衡量多少熵是在池中。它假设产生随机输出“耗尽”池,而添加熵“填充”池。这在理论上是正确的,但实际上并不重要。

例如,假设一个2,048字节池和一个对池的内容一无所知的攻击者。然后假设他从池中看到8个字节的输出。理论上,这排除了除1/ 2^64可能的初始条件之外的所有情况,只剩下那些将产生精确的8个字节的初始条件。但是没有已知的,甚至是不可想象的攻击者利用这些信息的方式。

没有添加额外的熵,并且有来自PRNG的1GB输出,攻击者就有了他所需的所有信息,以确定池的初始条件并预测池的下一个输出。问题是,除了尝试所有2^(8*2048)可能的初始条件之外,没有其他已知的方法。

实际上,只有两种可能的攻击:

  1. 猜池中添加的内容。如果在池中混合了128位以上的未知数据,攻击者无法尝试2^128或更多的组合,则此操作将失败。
  2. 在稍后的某个时间点猜测池的内容。但这需要猜测整个池。

总之,除非算法存在缺陷,否则池的输出不会显示有关池内容的有用信息。只要攻击者无法预测或猜出池中的所有信息,直到您从池中抽出点为止,他就无法预测池中会出现什么信息。(当然,假设他不能往游泳池里面看的话!)

票数 5
EN

Security用户

发布于 2012-04-30 02:54:57

概述。我不怪你被搞糊涂了。有许多(不公正的)错误信息存在于/dev/urandom上。

事实上,/dev/urandom是安全的。简短的版本是:使用/dev/urandom,忽略您可能听到的内容。对于几乎所有需要强加密质量随机数的情况,/dev/urandom都是正确的选择。/dev/random几乎不是正确的选择。

技术细节。关于我的主张背后的理由,见以下问题:

这里写了很多,我不想再重复了。

随机种子文件。按照一阶近似,您可以忽略随机种子文件.这是一个标准的机制,它存在于Linux发行版中,以确保/dev/urandom的安全性。作为一个应用程序开发人员,您不需要担心它。它发生在引擎盖下面。你所需要知道的是,它是通过设计存在的,它存在有一个很好的理由,而且是有益的。

你想要完整的解释吗?好的,给你。为了使其安全,/dev/urandom需要从某个地方获得至少128位左右的真正随机比特。一旦它有了128位左右的真正熵,从那时起,你就可以指望它的输出是安全的、加密的、不可预测的--不管你从中提取了多少输出。所以唯一的问题是,真正的随机性从何而来?

Linux内核有许多来源来收集真正的随机性:例如,中断的时间(例如按键、I/O)和其他低级别的东西。内核逐渐将这种随机性积累到/dev/urandom使用的池中,一旦这些源产生了一个聚合或128位左右的真正随机性,您就可以了。然而,这些源以相对较低的速率产生熵。因此,在启动之后,它们可能还没有产生足够的熵。为了解决这个问题,Linux发行版有一种机制来保留在重新启动过程中收集起来的熵。当您关闭计算机时,计算机会从/dev/urandom's熵池(请记住,熵池现在可能有足够的熵,所以这应该是很强的随机性)中提取一些随机性,并将其保存到随机种子文件中。下一次启动计算机时,操作系统从随机种子文件中提取熵,确保/dev/urandom's池现在至少有128位左右的良好随机性。因此,一旦计算机将足够大的熵积累到池中,/dev/urandom的输出将是很好的,无论您重新启动计算机多少次。

票数 3
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/14292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档