那麼,看着this bug,它確實似乎是一個問題。
挖掘到the source code,這條線是什麼使得它的工作:
srand(Configure::read('Security.cipherSeed'));
現在,爲什麼這項工作?因爲rand()
實現了一個僞隨機算法。因此,對於任何給定的已知的種子,可以理論上產生相同的一系列隨機輸出。要查看是否這會工作,讓我們來看看the PHP source code for rand()
,特別是內部php_rand
功能:
PHPAPI long php_rand(TSRMLS_D)
{
long ret;
if (!BG(rand_is_seeded)) {
php_srand(GENERATE_SEED() TSRMLS_CC);
}
我們知道這是沒有問題的,因爲我們手動播種(除非我們對安裝了Suhosin補丁服務器,那麼它將永遠是種子,因此不工作)。
#ifdef ZTS
ret = php_rand_r(&BG(rand_seed));
#else
# if defined(HAVE_RANDOM)
ret = random();
# elif defined(HAVE_LRAND48)
ret = lrand48();
# else
ret = rand();
# endif
#endif
哇,你看見發生了什麼?根據服務器規格,可以使用4個不同的隨機函數庫中的一個(rand()
,random()
,lrand48()
或它自己的內部隨機函數php_rand_r
)!這就是爲什麼它不能通過服務器安裝進行移植。
而是使用真實的加密庫,如MCrypt或GPG。
編輯:我已經提交了關於此主題的bug report來蛋糕。
謝謝ircmaxell。我看了一下密碼功能,但我不知道它是如何工作的。 我會嘗試那些encription庫。 – Min 2011-02-10 16:46:18