2009-07-26 36 views

回答

23

如果您的應用程序只是在有人在您的網站上註冊或正在登錄時計算md5,那麼您每小時會有多少次對md5的調用?幾百人?如果是這樣,我不認爲真的很小 PHP和MySQL之間的差異將是顯着的。

這個問題應該更像是「我在哪裏放置了使用md5存儲密碼的事實」而不是「什麼讓我幾乎沒有獲勝」。

而作爲旁註,另一個問題可能是:您可以在哪裏花費資源進行這種計算?如果你有10臺PHP服務器和一個DB重負載下已經服務器,你會得到你的答案;-)

但是,只是爲了好玩:

mysql> select benchmark(1000000, md5('test')); 
+---------------------------------+ 
| benchmark(1000000, md5('test')) | 
+---------------------------------+ 
|        0 | 
+---------------------------------+ 
1 row in set (2.24 sec) 

而在PHP:

$before = microtime(true); 
for ($i=0 ; $i<1000000 ; $i++) { 
    $a = md5('test'); 
} 
$after = microtime(true); 
echo ($after-$before) . "\n"; 

給出:

$ php ~/developpement/tests/temp/temp.php 
3.3341760635376 

但你可能不會計算一百萬這樣的MD5,你會嗎?

(這無關以防止SQL注入:剛剛逃出/報價數據總是或使用準備好的語句!)

4

我不知道哪個更快,但是如果您在PHP中執行此操作,則可避免SQL注入的可能性。

+1

在任何情況下,我在我的$ pwd參數上做my​​sql_real_escape_string。 – 2009-07-26 13:22:24

+1

這與它無關。準備好的聲明可以在不移動MD5函數的情況下解決這個問題,同時您也依靠PHP MD5函數來「轉義」密碼。 – Draemon 2009-07-26 13:22:54

+1

@Draemon:我沒有說有沒有其他的方法,但這個例子並沒有給出任何逃避參數的跡象。 @hiam:如果你決定在php中這樣做,你不應該首先逃避密碼字符串。 php的md5函數可以接受任何字符串,並保證返回^ [0-9a-f] {32} $ – Kip 2009-07-27 04:03:15

0

衡量它,這是確定的唯一途徑。

3

性能真的是問題嗎?這可能是微不足道的。

  • 在MySQL做它使DB做更多的工作,這是一件好事
  • 在MySQL做這意味着明文密碼被一起進一步傳遞(和數據庫連接通常是加密的)。
  • 這與SQL注入無關。您可以在不移動MD5功能的情況下修復第一個版本。另外,如果PHP的MD5函數中存在一個錯誤,那麼仍有可能發生注入攻擊。
0

我會說,讀列值出來的MySQL,然後比較在您的客戶端代碼中計算出的散列結果(例如php)。

這樣做的主要原因是它避免了愚蠢的事情,例如數據庫以非二進制方式(例如不區分大小寫等)對列進行整理,這對於散列通常是不合需要的。

相關問題