2010-02-12 30 views
0

在研究一些安全問題的時候,有一個問題,我們可以猜測在web服務器上運行的rand(timestamp)序列的生成。他說我們的第一個目標應該是服務器崩潰(假設服務器將在1分鐘內啓動),我們可以將我們的生成器與服務器同步,然後由網絡服務器生成的rand(時間戳)可以與我們的生成器相同。如果在網絡服務器上運行rand(時間戳)如何工作?

我很迷惑,如果我們有一個函數rand(時間戳),那豈不是依賴於系統的時間戳或服務器上的「時間」郵票?

P.S: 問一個一般性的問題 - 它不依賴,如果它是在JAVA/PHP/ASP。只是詢問Web服務器/編譯器如何工作這樣的代碼?

可能是其模糊的問題,但我想澄清。

回答

3

rand()許多implementions的默認行爲,是使用系統時間作爲種子如果未提供的種子值。即使這不是默認行爲,但幾乎可以保證應用程序將系統時間傳遞給srand()作爲種子來隨機化序列。

所以,如果你知道精確的系統時間,您可以生成會從遠程系統調用rand()產生相同的序列。幾年前,一家網上賭場使用這種隨機序列預測技術受到攻擊。

的解決方案是雙重的:從非可預測的硬件源(有商業單位到這一點)導出種子,並使用可用的最長僞數發生器。

已經有許多問題上等硬件發電機的話題,例如:

+0

因此可以說,如果我要測試我自己的webapp潛在的安全威脅。忘記密碼(暫時認爲它適用於臨時生成的字符串)選項,發送一個像http:// localhost/project/resetpwd = 1&key = 324123 所以我的問題,如果密鑰正在生成「蘭特(時間戳)」是否可以猜測? –

+1

如果你知道如何準確地調用rand函數,你可以精確地重現它,否則你就知道rand值的順序,並可以從某個特定的點開始依次嘗試它們...... –

+0

所以我們可以說,我創建了一個生成器生成密鑰,那麼我肯定可以從這個序列的密鑰中至少有一個密鑰,這將工作?對? 那麼應該是什麼理想的解決方案呢?有一個針對用戶的臨時密鑰的數據庫條目 - 但仍然可以利用,不是嗎? –

0

蘭特()返回一個僞隨機數。僞隨機數發生器通常用種子初始化。如果僞隨機發生器的兩個實例用相同的種子初始化,那麼它們將在連續調用rand時產生相同的序列。

到崩潰的服務器,你是迫使應用程序初始化當前Unix時間戳的僞隨機數發生器,因爲這是它使用的種子。攻擊者可以在幾次嘗試中輕鬆猜測種子/時間戳(服務器可能使用ntp,這使得它更容易)。

這就是爲什麼使用unix時間戳作爲種子不是一個好主意。在任何情況下,對於密碼使用而言,通常使用隨密碼庫附帶的隨機數發生器。例如,Openssl具有RAND_bytes,它提供了密碼強的僞隨機字節。在許多unix系統上,這個僞隨機數生成器會自動使用/ dev/urandom中的字節進行播種。有關更多詳細信息,請參閱http://www.openssl.org/docs/crypto/RAND_add.html

相關問題