Estaba yo el código HTML de la web de la Campus Party 2007 cuando me di cuenta de que el desarrollador de la web, muy concienciado con con la seguridad de sus usuarios, había insertado el siguiente código para la autenticación de los usuarios (enviar usuario y contraseña, vamos ;):
<script>
function seguridad()
{
document.getElementById("pass_public_key").value =Math.random();
document.getElementById("pass").value = calcMD5c(document.getElementById("pass_public_key").value + calcMD5c(document.getElementById("pass_tmp").value));
}
</script>
[...]
<A href="#" ONCLICK="seguridad();theF=document.getElementById('loginForm');theF.submit();return false;" class="transparentLink" style="font-size:15px;">Entrar</a>
Dejando de un lado lo bonito que pueda ser el código, vemos que el desarrollador ha decidido que la contraseña de sus usuarios es muy importante y no debería viajar sin cifrar por la red. Me parece bastante razonable ya que durante el evento la gente accede a la web, y cualquiera podría enchufar un sniffer y cazar la contraseña por el camino (no sería la primera vez). Además es tan cuidadoso que ni siquiera manda el Hash de la contraseña, sino que manda el Hash de un número aleatorio concatenado el Hash de la contraseña:
MD5(random() || MD5(PASSWORD))
De esta forma, el navegador en lugar de enviar nuestra cotraseña en texto plano de forma que cualquiera podría leerla por el camino, envía el Hash que hemos indicado en la fórmula y el número aleatorio para poder calcular el Hash en el servidor y comprobar si ambos hashes (el calculado en el cliente y el calculado en el servidor) son iguales.
En fin, hasta aquí todo es muy correcto, y son todo muy buenas intenciones, hasta que repasas un poco más el código fuente y te das cuenta de lo siguiente (limpio un poco el código para hacerlo más legible):
<form method="POST" id="loginForm">
<input type="hidden" name="login" value="1">
<input type="text" name="dni" value="DNI" onclick="this.value=''">
<div>
<input type="password" name="pass_tmp" id="pass_tmp">
<input type="hidden" name="pass_public_key" id="pass_public_key" value="">
<input type="hidden" name="pass" id="pass" value="">
</div>
<A href="#" ONCLICK="seguridad();theF=document.getElementById('loginForm');theF.submit();return false;">Entrar</a>
<A href="" onClick="[...]">Recordar contraseña</a><br>
</form>
El desarrollador ha metido el campo donde el usuario introduce la contraseña en texto plano en el formulario que envía al servidor y no lo ha borrado por javascript. Como consecuencia, además del bonito Hash que envía al servidor, también envía siempre la contraseña en texto plano.
En definitiva, la intención era buena, pero la implementación es inútil.

24 may 2007 | 06:36 PM
se escucha un grito en la lejania: hachetetepeessseeee ...
24 may 2007 | 06:42 PM
Moisés, yo soy de los que piensa que hoy por hoy HTTPS en la mayoría de los casos sólo sirve para delegar responsabilidades en el usuario :)
El 80% de los usuarios (me invento el porcentaje y seguramente esté tirando a la baja) no hacen ni caso a los avisos de seguridad de los navegadores y cuando les salta un aviso informando de algo sospechoso con los certificados, simplemente da a "ok" y siguen como si nada, con lo que se comerían un man-in-the-middle a pesar del HTTPS. Eso sí, pones el listón un poco más alto para el atacante, pero no mucho más porque cualquier script-kiddie puede hacer un man-in-the-middle de una conexión HTTPS.
25 may 2007 | 10:24 PM
Esta claro que no hay una solucion perfecta pero pero si delegas la seguridad en el mensaje en lugar del transporte te encuentras con que e toca cifrar todos los envios que hagas, y esa es una responsabilidad muy grande que corre a cargo del programador.
Finalmente por desconocimiento, por vagancia o por descuido te dejas un envio sin cifrar y la lias, justo como ha ocurrido en este caso.
No siempre es optimo utilizar https pero por lo menos, cuando lo activas, sabes que no hay descuido posible: todo se cifra.
25 may 2007 | 10:31 PM
Sí, como desarrolladores es lo mejor que podemos hacer, es la mejor solución de la que disponemos, pero lamentablemente los usuarios necesitan más educación para que realmente saquen provecho de HTTPS
En un mundo ideal los usuarios se tomarían su seguridad en serio y comprobarían los certificados, pero a veces no lo hacemos ni nosotros :)