2011-02-10 88 views
3

我正在cakephp應用程序中使用Security :: cipher來加密一些數據。它完美的工作,但我已經移動文件和數據庫到另一臺服務器,現在加密的結果是不同的。 我試着用一些簡單的線條:安全性:密碼加密結果取決於服務器嗎?

$security = new Security; 
$code = $security->cipher('1234', Configure::read('Security.cipherSeed')); 

當我打印$代碼,該值是在兩臺服務器上不同。我在兩個core.php文件中都配置了相同的Security.cipherSeed。 Security :: cipher函數是否使用一些服務器值來加密?

謝謝。

回答

6

那麼,看着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)!這就是爲什麼它不能通過服務器安裝進行移植。

而是使用真實的加密庫,如MCryptGPG

編輯:我已經提交了關於此主題的bug report來蛋糕。

+0

謝謝ircmaxell。我看了一下密碼功能,但我不知道它是如何工作的。 我會嘗試那些encription庫。 – Min 2011-02-10 16:46:18