Что быстрее/лучше использовать: функция MySQL или PHP md5?

Я проверил пароли для пользователей против БД.

Что быстрее, функция MySQL MD5

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

ИЛИ функция PHP MD5

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

Каков правильный путь между двумя параметрами?

Ответ 1

Если ваше приложение только калькулирует 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-инъекций: просто избегайте/цитируйте свои данные! всегда! или используйте подготовленные заявления)

Ответ 2

Я не знаю, что быстрее, но если вы делаете это в PHP, вы избегаете возможности SQL-инъекции.

Ответ 3

Является ли производительность действительно проблемой? Это, вероятно, будет незначительным.

  • Выполнение этого в MySQL делает БД больше работать, что хорошо.
  • Выполнение этого в MySQL означает, что пароль cleartext передается дальше (и соединение с БД часто незашифровано).
  • Это не имеет никакого отношения к SQL-инъекции. Вы можете исправить первую версию без перемещения функции MD5. Также, если была ошибка в функции PHP MD5, все еще есть возможность инъекционной атаки.

Ответ 4

Измерьте это, это единственный способ быть уверенным.

Ответ 5

Я бы сказал, прочитайте значение столбца из mysql, а затем сравните результат с вычисленным хэшем в вашем клиентском коде (например, php).

Основная причина этого заключается в том, что он избегает таких глупых вещей, как база данных, сопоставляющая столбец не двоичным образом (например, без учета регистра и т.д.), что обычно нежелательно для хэша.