2013-06-28 42 views
2

http://php.net/manual/en/function.mt-rand.php爲什麼PHP的mt_rand不是密碼保密的?

注意此功能不會產生加密安全值,而不應被用於密碼的目的。

有人可以請解釋這是什麼意思在網站上下文?這是否意味着它不應該被用來生成安全令牌?

在32位系統PHP_INT_SIZE是剛剛超過2十億。如果我生成一個數字mt_rand(0, PHP_INT_SIZE)並添加一個長度爲100個字符的隨機字符串並將其用作安全令牌,是否表示它不安全?

回答

2

如果通過「安全令牌」,你的意思是一個nonce,即一個使用的令牌應該是唯一的,幾乎肯定,然後mt_rand就好了。

「不加密生成安全值」,在這種情況下意味着,給定的發電機someone can predict what its output will be in the future的狀態的足夠信息。顯然,如果您要使用所述輸出來加密敏感信息,那麼這是一種破壞行爲。

+0

謝謝。你可以給一個網站的應用程序的例子,有人有「有關發電機的狀態足夠的信息」,並使用它不利?我讀了你的第二個鏈接,但我仍然不確定。 – texelate

+0

@texelate:很難給出一個實際的例子,因爲典型的web應用程序不會將加密數據發送給沒有加密密鑰的人。但是你可以從[this]得到一些想法(http://crypto.stackexchange.com/questions/2231/cryptographic-security-of-php-mt-rand-function-using-mersenne-twister-algo)。 – Jon

+1

@texelate:隨機示例。您存儲加密的用戶文本(如上所述的加密方法),其中用MT生成了密鑰,但只有所有者保留該密鑰。有人註冊並實現(或猜測或知道)他們的密鑰是由MT生成的。然後他們進入你的數據庫(也許是一個簡單的SQL注入)並獲得加密文本。如果一段文本足夠大並且只包含ASCII字符(合理的英文假設),他們可以在不知道密鑰的情況下解密該文本。 – Jon

1

這是因爲它不是真正的隨機。 Mersenne Twister基於線性遞歸,所以任何由線性遞歸產生的僞隨機數序列都是不安全的,因爲從輸出的足夠長的子序列可以預測進一步的結果。

相關問題