我检查了用户对数据库的密码。速度更快/使用更好: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