有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果在Web服务器上运行,rand(时间戳)是如何工作的?

在研究一些安全问题时,有一个问题是人们可以猜测在Web服务器中运行的rand(时间戳)序列的生成。他说,我们的第一个目标应该是使服务器崩溃(假设服务器将在1分钟内启动),我们可以将生成器与服务器同步,然后Web服务器生成的rand(时间戳)与生成器相同

我很困惑,如果我们有一个函数rand(timestamp),它会依赖于系统时间戳还是服务器“启动时间”戳

附言: 问一个一般性问题——如果是JAVA/PHP/ASP,则不依赖于它。问一下Web服务器/编译器是如何为这些代码工作的

这可能是一个模糊的问题,但我想澄清一下


共 (2) 个答案

  1. # 1 楼答案

    许多rand()实现的默认行为是,如果未提供种子值,则将系统时间用作种子。即使这不是默认行为,也几乎可以保证应用程序会将系统时间作为种子传递给srand(),以随机化序列

    因此,如果您知道精确的系统时间,您可以生成与远程系统调用rand()生成的序列相同的序列。几年前,一家在线赌场遭到了这种随机序列预测技术的攻击

    解决方案有两个方面:从一个不可预测的硬件源(有商用单元)派生种子,并使用可用的最长伪数生成器

    关于硬件生成器的话题,有很多问题,例如:

  2. # 2 楼答案

    rand()返回一个伪随机数。伪随机数生成器通常使用种子进行初始化。如果伪随机生成器的两个实例使用相同的种子初始化,那么它们将在连续调用rand时生成相同的序列

    通过使服务器崩溃,您将迫使应用程序使用当前的unix时间戳初始化伪随机生成器,因为它将此时间戳用作种子。攻击者只需几次尝试就可以轻松猜出种子/时间戳(服务器可能会使用ntp,这让它变得更容易)

    这就是为什么使用unix时间戳作为种子不是一个好主意。在任何情况下,对于加密用途,通常使用加密库附带的随机数生成器。例如,Openssl有RAND_字节,可以使用加密强伪随机字节。在许多unix系统上,这个伪随机数生成器会自动添加来自/dev/uradom的字节。有关更多详细信息,请参见http://www.openssl.org/docs/crypto/RAND_add.html