¿Qué es más rápido / mejor de usar: la función md5 de MySQL o PHP?

Comprobé las contraseñas para los usuarios contra el DB.

Lo que es más rápido, la función MySQL MD5

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

O la función PHP MD5

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

¿Cuál es el camino correcto entre las dos opciones?

Si su aplicación solo está calculando md5 cuando alguien se registra en su sitio o inicia sesión, ¿tendrá muchas llamadas por md5 por hora? ¿Par de cientos? Si es así, no creo que la pequeña diferencia entre PHP y MySQL sea significativa.

La pregunta debería ser más bien “¿dónde pongo el hecho de que la contraseña se almacena utilizando md5” que “lo que me hace ganar casi nada”.

Y, como nota al margen, otra pregunta podría ser: ¿dónde puede permitirse gastar recursos para ese tipo de cálculos? Si tiene 10 servidores PHP y un servidor de bases de datos que ya están cargados, obtendrá su respuesta 😉

Pero, solo por diversión:

 mysql> select benchmark(1000000, md5('test')); +---------------------------------+ | benchmark(1000000, md5('test')) | +---------------------------------+ | 0 | +---------------------------------+ 1 row in set (2.24 sec) 

Y en PHP:

 $before = microtime(true); for ($i=0 ; $i<1000000 ; $i++) { $a = md5('test'); } $after = microtime(true); echo ($after-$before) . "\n"; 

da :

 $ php ~/developpement/tests/temp/temp.php 3.3341760635376 

Pero probablemente no estarás calculando un millón de md5 como este, ¿o sí?

(Y esto no tiene nada que ver con la prevención de inyecciones de SQL: ¡solo escape / cite sus datos! ¡Siempre! O use declaraciones preparadas)

No sé cuál es más rápido, pero si lo haces en PHP, evitas la posibilidad de inyección SQL.

¿El rendimiento es realmente un problema aquí? Es probable que sea marginal.

  • Hacerlo en MySQL hace que el DB haga más trabajo, lo cual es algo bueno
  • Hacerlo en MySQL significa que la contraseña de texto plano se pasa más adelante (y la conexión de DB a menudo no está encriptada).
  • Esto no tiene nada que ver con la inyección de SQL. Podría arreglar la primera versión sin mover la función MD5. Además, si hubiera un error en la función MD5 de PHP, aún existe la posibilidad de un ataque de inyección.

Mídelo, es la única manera de estar seguro.

Yo diría, lea el valor de la columna de mysql, luego compare el resultado con el hash calculado en su código de cliente (por ejemplo, php).

La razón principal para hacer esto es que evita cosas estúpidas como la base de datos que recostack la columna de forma no binaria (por ejemplo, insensible a mayúsculas y minúsculas, etc.), que generalmente no es deseable para un hash.