我檢查了用戶對數據庫的密碼。速度更快/使用更好:MySQL還是PHP md5函數?
什麼是快,MySQL的 MD5函數
... pwd = MD5('.$pwd.')
或PHP MD5函數
... pwd = '.md5($pwd).'
什麼是這兩個選項之間的正確方法?
我檢查了用戶對數據庫的密碼。速度更快/使用更好:MySQL還是PHP md5函數?
什麼是快,MySQL的 MD5函數
... pwd = MD5('.$pwd.')
或PHP MD5函數
... pwd = '.md5($pwd).'
什麼是這兩個選項之間的正確方法?
如果您的應用程序只是在有人在您的網站上註冊或正在登錄時計算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注入:剛剛逃出/報價數據總是或使用準備好的語句!)
我不知道哪個更快,但是如果您在PHP中執行此操作,則可避免SQL注入的可能性。
衡量它,這是確定的唯一途徑。
性能真的是問題嗎?這可能是微不足道的。
我會說,讀列值出來的MySQL,然後比較在您的客戶端代碼中計算出的散列結果(例如php)。
這樣做的主要原因是它避免了愚蠢的事情,例如數據庫以非二進制方式(例如不區分大小寫等)對列進行整理,這對於散列通常是不合需要的。
在任何情況下,我在我的$ pwd參數上做mysql_real_escape_string。 – 2009-07-26 13:22:24
這與它無關。準備好的聲明可以在不移動MD5函數的情況下解決這個問題,同時您也依靠PHP MD5函數來「轉義」密碼。 – Draemon 2009-07-26 13:22:54
@Draemon:我沒有說有沒有其他的方法,但這個例子並沒有給出任何逃避參數的跡象。 @hiam:如果你決定在php中這樣做,你不應該首先逃避密碼字符串。 php的md5函數可以接受任何字符串,並保證返回^ [0-9a-f] {32} $ – Kip 2009-07-27 04:03:15