Esta recomendación no tiene sentido:
El código JavaScript utilizado para marcar o cifrar la contraseña también debe transferirse al cliente. Si el atacante puede montar un ataque de hombre en el medio, también podrá inspeccionar el código JavaScript utilizado para el cifrado o incluso podría reemplazarlo con otra cosa (como ningún cifrado).
Hashing en lugar de encriptación tiene aún menos sentido, porque esto solo funcionaría si el servidor acepta la contraseña hash en lugar de la contraseña real. En este caso, el atacante ni siquiera necesitaría saber la contraseña, solo necesita saber el hash.
Lo que podría ayudar serían los certificados de cliente porque no se puede montar un ataque SSL en el medio que preserva el certificado de cliente (y una degradación a HTTP simple tampoco enviaría el certificado). Pero, debido a que primero tiene que distribuir los certificados a los clientes y hacer que los instalen en el navegador, esta solución funciona solo cuando tiene pocos clientes.
Aparte de eso: si el atacante está en el medio, es posible que no necesite la contraseña en absoluto. Todo lo que necesita es que la víctima haya iniciado sesión y luego el atacante puede hacerse cargo de la sesión existente.
También podría ser útil detectar tal situación de intermediario, para que pueda informar al usuario y denegar el inicio de sesión desde redes comprometidas. Algunas ideas para detectar degradaciones de conexión (es decir, http al atacante que las reenvían como https):
- Verifique el método de la ubicación actual con JavaScript.
- Crea una cookie segura con JavaScript. Solo debe devolverse si el sitio se sirve con https (que no es de baja calificación).
- Incluya un script como HTTP que sirva una imagen y verifique en el lado del servidor cómo se incluyó la imagen. Si se incluyó como HTTPS, puede asumir un ataque de degradación de HTTP porque lo ha incluido explícitamente con HTTP. Si se accede con HTTP, también tiene un ataque de baja calificación (pero con un atacante más inteligente) o el navegador no se preocupa por el contenido mixto.
Y sobre cómo detectar el hombre en el medio con certificados falsos:
- Configura un segundo sitio https (con un nombre de host diferente) y crea una solicitud ajax para este sitio de una manera que no sea sencillo para el atacante cambiar a http (por ejemplo, crear una URL dinámicamente). Si el atacante simplemente intenta MITM en cualquier sitio, esta solicitud de ajax fallará al menos en algunos navegadores, ya que el certificado no es confiable y el navegador solo solicitará al usuario los certificados principales de un sitio.
Por supuesto, todo esto solo ayuda contra un atacante que no está realmente decidido a hackearte especialmente a ti, sino a los objetivos más fáciles. En este caso, todo lo que debe hacer es ser un poco más difícil de atacar que el resto.