13

我根据数据库检查了用户的密码。

什么更快,MySQL MD5 函数

... pwd = MD5('.$pwd.')

PHP MD5 函数

... pwd = '.md5($pwd).'

这两个选项之间的正确方法是什么?

4

5 回答 5

26

如果您的应用程序仅在有人在您的站点上注册或登录时才计算 md5,那么您每小时会调用多次 md5 吗?几百?如果是这样,我认为PHP 和 MySQL 之间真正的微小差异根本不会显着。

问题应该更像是“我在哪里放置密码是使用 md5 存储的事实”,而不是“是什么让我几乎一无所获”。

而且,作为旁注,另一个问题可能是:您在哪里可以负担得起用于这种计算的资源?如果您有 10 台 PHP 服务器和一台数据库服务器已经处于高负载状态,您就会得到答案;-)

但是,只是为了好玩:

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 注入无关:只需转义/引用您的数据!总是!或使用准备好的语句)

于 2009-07-26T13:23:29.337 回答
5

我不知道哪个更快,但如果你在 PHP 中这样做,你可以避免 SQL 注入的可能性。

于 2009-07-26T13:13:21.597 回答
3

性能真的是这里的问题吗?很可能是微不足道的。

  • 在 MySQL 中做这件事会让 DB 做更多的工作,这是一件好事
  • 在 MySQL 中执行此操作意味着明文密码会进一步传递(并且数据库连接通常是未加密的)。
  • 这与 SQL 注入无关。您可以在不移动 MD5 功能的情况下修复第一个版本。此外,如果 PHP 的 MD5 函数中存在错误,则仍有可能发生注入攻击。
于 2009-07-26T13:21:17.357 回答
0

测量它,这是唯一确定的方法。

于 2009-07-26T13:19:24.427 回答
0

我会说,从 mysql 中读取列值,然后将结果与客户端代码(例如 php)中计算的哈希值进行比较。

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

于 2009-07-26T21:45:55.920 回答