2009-07-26 104 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)。

这样做的主要原因是它避免了愚蠢的事情,例如数据库以非二进制方式(例如不区分大小写等)对列进行整理,这对于散列通常是不合需要的。

相关问题