TLS usa una clave pública y privada para cifrar una sesión. Los clientes solo tienen el certificado que contiene la clave pública, pero para usarlo, el servidor contiene la clave privada. Fuera del servidor, esta comunicación es segura. Dentro del servidor, un atacante podría aprender la clave y descifrar las comunicaciones.
Si utilizamos el cifrado de la clave pública / privada para cifrar una contraseña y un atacante ingresa al servidor, pueden aprender la clave privada y luego descifrar todas las contraseñas.
El hash no tiene clave (aunque puede usar "sal"). A menudo se le llama función unidireccional, por lo que, a diferencia del cifrado, no tiene algoritmo "inverso". Si hash datos, no puedes deshacerlos fácilmente. Todavía puedes atacar con fuerza bruta un hash al intentar cada contraseña que puedas imaginar, y si los hashes coinciden, lo has adivinado. Pero no hay un valor mágico que recupere todas las contraseñas. Es por eso que el hashing almacena las contraseñas de forma más segura que el cifrado.
Con respecto a las fallas en MD5, SHA-1, etc., recuerde que hay varios usos para las funciones criptográficas de hash, y que las vulnerabilidades a las que se expone difieren según el caso de uso. Un uso para un hash es generar un resumen del mensaje, que es un número único que ayuda a validar una parte del texto sin cambios (como los datos contenidos en un certificado). Si se puede falsificar un segundo documento con el mismo valor de resumen, luego, un atacante podría crear un certificado falso y realizar un ataque de hombre en el medio a todos los usuarios del servidor. Pero si se encuentra una colisión entre dos contraseñas en una base de datos, corre el riesgo de filtrar solo la información de que tanto Ulkoma como JohnDeters eligieron la misma contraseña. Eso conlleva riesgos solo para dos personas en lugar de para cada usuario del sistema, lo que en general es un problema menos grave.
La propuesta de generar una clave pública única para cada usuario (descartar la clave privada), luego cifrar y almacenar la contraseña, da como resultado un sistema equivalente funcionalmente al uso de un hash salado. El atacante no tiene que descifrar la clave pública, solo tiene que intentar cifrar un montón de contraseñas con la clave pública hasta obtener una coincidencia.