Creo que la pieza que falta para ti es el uso de sales. Tienes razón en que el envío de un hash no es bueno, ya que puede ser detectado, se puede usar una sal para proteger el hash de la contraseña. Una sal es un fragmento de datos aleatorizados con hash que se agrega al hash de la contraseña, luego todo se vuelve a hash. spw = hash (hash (pwd) + sal). Puedo enviar el spw más el salt al otro lado, que luego puede usar la versión almacenada localmente de la contraseña para autenticarse.
El MiTM puede interceptar spw y la sal, pero para obtener pwd tendría que hacerlo con fuerza bruta, lo que sería computacionalmente costoso y requeriría mucho tiempo. Tenga en cuenta que esto es vulnerable a los ataques de reproducción, por lo que no estoy defendiendo lo anterior como un método de autenticación, el punto es que al agregar un salt, el MiTM no puede obtener el hash de la contraseña. El Protocolo de autenticación Challenge Handshake es un ejemplo de la forma en que se usan las sales en la autenticación, pero si realmente quiere evitar que los ataques MiTM use claves públicas-privadas.