Estrella, parte de este equipo de trabajo, nos hizo el favor de crear este post porque conoce muy bien dicho tema.
Solución:
La diferencia principal: MD5 y otras funciones hash diseñadas para verificar datos se diseñaron para ser rápidas, y bcrypt() se diseñó para ser lenta.
Cuando está verificando datos, desea la velocidad, porque desea verificar los datos lo más rápido posible.
Cuando intenta proteger las credenciales, la velocidad juega en su contra. Un atacante con una copia de un hash de contraseña podrá ejecutar muchos más ataques de fuerza bruta porque MD5 y SHA1, etc., son baratos de ejecutar.
bcrypt, por el contrario, es deliberadamente caro. Esto importa poco cuando hay uno o dos intentos de autenticación por parte del usuario genuino, pero es mucho más costoso para la fuerza bruta.
Hay tres diferencias significativas entre bcrypt y hash varias veces con MD5:
- El tamaño de la salida: 128 bits (16 bytes) para MD5 y 448 bits (56 bytes) para bcrypt. Si almacena millones de hashes en una base de datos, esto debe tenerse en cuenta.
- Las colisiones y los ataques de preimagen son posibles contra MD5.
- Bcrypt se puede configurar para iterar más y más a medida que las CPU se vuelven más y más poderosas.
Por lo tanto, usar salting-and-stretching con MD5 no es tan seguro como usar bcrypt. Este problema se puede resolver seleccionando una mejor función hash que MD5.
Por ejemplo, si se selecciona SHA-256, el tamaño de salida será de 256 bits (32 bytes). Si salting-and-stretching se puede configurar para aumentar la cantidad de iteraciones como bcrypt, entonces no hay diferencia entre ambos métodos, excepto la cantidad de espacio requerido para almacenar los hashes de resultados.
Al final de todo puedes encontrar las crónicas de otros sys admins, tú igualmente eres capaz dejar el tuyo si te apetece.