如果在webserver上运行,rand(timestamp)如何工作?

时间:2010-02-12 00:35:07

标签: java php asp.net security webserver

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

我很困惑,如果我们有一个函数rand(timestamp),它不会依赖于系统时间戳或服务器“up time”标记吗?

P.S: 提出一个普遍的问题 - 如果它在JAVA / PHP / ASP中则不依赖。只是询问网络服务器/编译器如何为这些代码工作?

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

2 个答案:

答案 0 :(得分:3)

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

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

解决方案有两个方面:从不可预测的硬件源(有商业单位)中获取种子并使用可用的最长伪数生成器。

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

答案 1 :(得分:0)

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

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

这就是为什么使用unix时间戳作为种子并不是一个好主意。在任何情况下,对于加密用途,通常使用加密库附带的随机数生成器。例如,Openssl具有RAND_bytes,其使得可用加密强伪随机字节。在许多unix系统中,这个伪随机数发生器自动从/ ​​dev / urandom中加入字节。有关详细信息,请参阅http://www.openssl.org/docs/crypto/RAND_add.html